前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >堆,栈和GC详解

堆,栈和GC详解

作者头像
如来
发布2020-07-15 11:06:46
9980
发布2020-07-15 11:06:46
举报
文章被收录于专栏:如来的java学习如来的java学习

1、栈(stack)是存放方法的局部变量的内存空间,每个方法都会分配一块内存空间frame,方法一旦执行完成,frame就被销毁,对于原始类型,变量的值也保存在stack中,对于引用类型,stack里保存的是指向对象的内存地址(引用)

</br>

2、堆(heap)是存放的Object,java是传值的,不是传引用的。

</br>

3、垃圾回收器GC(Garbage Collection):

局部变量方法在执行完后内存马上被回收。

Heap里面的对象由GC自动回收。

GC维护和检测对象的引用,当引用数为0时自动回收。

GC并不是实时回收的。

以下面的程序为例来说明jvm内存中的Stack,Heap和GC(垃圾回收):

第一步:在程序未执行时的堆栈如下图

第二步:开始执行main()方法,首先jvm会先为main方法分配一段内存空间,内存又依次为rate,money,zhangsan开辟空间,因为zhangsan是引用数据类型,所以jvm会在Heap中创建对象,分配一段内存空间,Stack中的zhangsan指向Heap中为zhangsan这个对象的内存地址

第三步:接着执行task1,jvm为task1方法分配内存空间,task1中有两个变量rate和hour,jvm会从main的内存中将rate的的值传递过来,同时为hour分配空间,如下图

第四步:task1执行完,jvm会自动释放内存,task1的内存块将不存在

接下来将执行task2,传递一个person进来,jvm会给person和hour分配内存空间,person同样指向heap中的内存空间,它是main方法中zhangsan的引用

最后,task2执行完后,jvm自动回收task2的内存空间,接着回收main函数的内存空间,然后没有任何对象指向Heap中的zhangsan,jvm就会回收Heap中的zhangsan对象的内存空间

下回补充 静态区知识(也就是带和不带static的区别)。

作者:佛祖

来源:简书

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档