堆和栈
堆内存的特点,未初始化的数据是不能使用的,但是可以在堆里使用(堆空间默认自动初始化),不能在栈里使用,不同的类型的初始化值不同。
内存在存储数据的时候都是通过地址(即一块连续的二进制)来实现的。
1 .主函数先进栈,定义一个arr
实体创建在堆里,然后给这个数组(实体)分配一个内存地址,
这样,就在堆和栈里分别创建了实体和变量arr。
2 .将堆内存分配的地址赋给变量arr,这样,arr就通过地址指向了数组,arr就通过地址来操纵数组,这样,数组就不叫基本数据类型,而是引用数据类型——arr引用了堆内存中的实体(可以理解为c或c++的指针,Java成长自c++和c++很像,优化了c++)
3 .当执行int [] arr=null; 就取消了arr对数据类型的指向,这时,堆内存不会释放此数据类型,而是等待java的垃圾自动回收机制,不定时的自动回收。
所以:
堆和栈的区别:
存储类型:栈存放局部变量,堆存储实体
更新速度:栈的更新速度快,因为局部变量的生命周期很短。
释放时间:栈内存存放的变量生命周期一旦结束就会被释放,而堆则等待java自动回收。
附加:
线程和堆栈
每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。
JVM内存的划分五片:
1. 寄存器;
2. 本地方法区;
3. 方法区;
4. 栈内存;
5. 堆内存。