堆与栈的关系与区别

参考博文:
https://blog.csdn.net/pt666/article/details/70876410/
https://blog.csdn.net/qq_33384065/article/details/80282023


java代码是需要在jvm环境下运行的,而jvm作为java虚拟机,自然也是需要获得内存的,而且它还对它自己所分得的内存进行了细分,每一部分内存所执行的功能和处理的方式都是不同的,如下图所示:

在这里插入图片描述
图中可以看出jvm将其内存空间分成了5个部分,分别是:

  • 方法区
  • java堆
  • java栈
  • 本地方法栈
  • 指令计数器以及其他隐含寄存器

我们这里讨论的堆和栈就是上图中的java堆和java栈。
请注意这里讨论的堆和栈与数据结构里的堆栈有本质区别。

栈内存里面存储的都是局部变量。局部变量在定义时放入栈中,在退出其作用域后被从栈中移出,因此栈内存中更新很快。

堆内存里面存储的都是一个个的对象,都是new出来的(注意String类型的也存储在堆中,尽管有时候可能并没有显式地写new)。堆里面的对象不会被随意地释放,当某个对象已经没有任何指向其的引用的时候,它就变成了java里的垃圾,这时候它并没有马上被释放,而是要靠jvm的垃圾回收机制来释放,其释放时间就要根据垃圾回收机制的策略来定了。

还需要注意一点,当定义数组的时候,比如如下代码:

int arr = new int[3];

这里的arr变量是局部变量,会被存储到栈中,而数组的元素因为是new出来的,因此会存放于堆中,而arr中存放的就是这个数组的首地址。顺便提一句,存放在堆中的元素如果没有显式给定初始值,是会被自动赋予一个初始值的,比如0、null等等,而在栈中如果没有显示指定,是不会自动赋值的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值