type
status
date
slug
summary
tags
category
icon
password
JVM运行时内存区域结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F5a2b3856-b32d-40f7-b24f-20e459cbaec7%2FUntitled.png?table=block&id=72fc2f54-8392-46f3-b9be-b69840c6d9b0&t=72fc2f54-8392-46f3-b9be-b69840c6d9b0)
Java简单内存模型
Java的内存模型包括了线程共享的堆和线程私有的栈两个主要部分。其中,堆被用来存储对象和数组,而栈则被用来存储基本数据类型和对象引用。此外,线程还拥有自己的程序计数器和本地方法栈。这些内存区域的结构对于Java程序的正确性和性能至关重要。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F73a7ee90-6162-4585-a373-76c48cfdaaef%2FUntitled.png?table=block&id=baae37d1-0398-4f58-9674-9f1982fe7a9b&t=baae37d1-0398-4f58-9674-9f1982fe7a9b)
变量在内存中是怎样存储的?
- 当创建变量时需要在内存中申请空间
- 内参系统根据变量类型来分配存储空间,分配的空间只能用于存储该类型的数据
- 基本类型:存储在栈区,直接存储值
- 引用类型:对象存储在 heap 区,栈区存储真实对象的地址引用
- 栈被用来存储基本数据类型和对象引用,
- 堆被用来存储对象和数组,保存 new 出来的对象
- 方法区被用来存储类的信息、常量、静态变量等
一个程序在内存中是如何运行的?
- 任何的 java 程序运行一定要通过 main 方法
- 然后依次执行程序,还没有 new 出来对象之前都是 null,new 出来的对象会被放到 Heap 区
- 在 Stack 中 user 会存储 user 对象的地址,引用 Heap 中的 user 真实对象
- Methon Area 存储了 user 对象的方法
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0839e38c-af47-4061-ad44-b632d6eae5c4%2FUntitled.png?table=block&id=e2107af6-912f-4631-a7a6-76e7bcabea26&t=e2107af6-912f-4631-a7a6-76e7bcabea26)
- 当我们给 user 对象的属性赋值时,Heap 中的user对象属性会发生变化
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F2f21ccd1-4b85-438d-8955-0cde883a295b%2FUntitled.png?table=block&id=20c7109b-e799-4e2d-8815-4691969a1156&t=20c7109b-e799-4e2d-8815-4691969a1156)
- 当我们调用方法时, 会在 main 方法块的上面创建一个方法栈,叫做栈帧(Stack Frame)
- 方法栈的特点是后进先出,每个方法的局部变量存在与栈帧中,在一个方法返回之后里面的栈帧就会被销毁,局部变量就变为不可访问了
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fefba88a2-5c13-49e5-ad37-4890a334d69d%2FUntitled.png?table=block&id=5b3348d6-10d6-4c81-9967-caa73cc4dac3&t=5b3348d6-10d6-4c81-9967-caa73cc4dac3)
- 然后我们再 new 一个 user2对象
- user 对象与 user2 对象都是 new 出来的。所以两个对象是不同的地址
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F77dca953-9075-4876-aba2-027411c830b5%2FUntitled.png?table=block&id=19774ceb-5ca1-4177-9c37-a8e32538fc57&t=19774ceb-5ca1-4177-9c37-a8e32538fc57)
- 然后我们创建 user3,将 user2 的地址赋给 user3
- 这时候 user3 和 user2 指向的是同一个对象
- 改变 user3 的属性时,user2 的属性也发生改变
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7a356611-5d1e-4555-834e-371a60867978%2FUntitled.png?table=block&id=d9905161-a049-42fe-b085-c80fa6246b0a&t=d9905161-a049-42fe-b085-c80fa6246b0a)
- Java 中的值传递
- 基本类型传递的是值
- 引用类型传递的是地址
什么是 this ?
- 构造器中 this 指向正要初始化的对象地址
- 普通方法中 this 指向调用该方法的对象地址
- this 不能用在出现 static 的地方
- this(): 也可以调用构造方法,必须写在第一行(最前面)
- 这段代码运行结果如下
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F6e77e65a-eb0d-4891-9f47-27a686d23540%2FUntitled.png?table=block&id=a1f3a74c-3167-4831-bc78-959dc41eab47&t=a1f3a74c-3167-4831-bc78-959dc41eab47)