堆和栈

博客介绍了堆和栈的相关知识。堆空间默认自动初始化,可使用未初始化数据,栈则不行。主函数进栈后,在堆创建实体并分配地址给栈中变量,变量通过地址操纵数组。还阐述了堆和栈在存储类型、更新速度、释放时间上的区别,以及线程和堆栈的关系,最后提及JVM内存划分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆和栈
堆内存的特点,未初始化的数据是不能使用的,但是可以在堆里使用(堆空间默认自动初始化),不能在栈里使用,不同的类型的初始化值不同。

内存在存储数据的时候都是通过地址(即一块连续的二进制)来实现的。

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.   堆内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值