一个java对象的生命周期

总所周知JVM的Heap是分代管理的,如下:
在这里插入图片描述

那么一个对象从创建到回收的流程是怎么样的?

  1. JVM启动后,第一次YGC之前,S0、S1区都是空的,所有新创建的对象都是分配在eden区的
    在这里插入图片描述

  2. 当eden区空间占满时,会触发YGC。会将没有引用到的对象(下称"死亡的对象")删除,将有引用的对象(下称"存活的对象")复制到S0区,并将对象的age加1,然后将整个eden区全部清空
    在这里插入图片描述

  3. 下一次YGC时,eden区发生的动作同步骤2,(删除死亡的对象,将存活的对象复制到幸存者区),不过这次是将有引用的对象复制到S1区。同时将之前S0区的存活的对象也复制到S1区后,并将这些"幸存"下来的对象age加1。(这就是为什么S0和S1区大小一般相同)此时将eden区和S0区的数据全部清空。
    在这里插入图片描述

  4. 下一次YGC时,eden区发生的动作类似,(删除死亡的对象,将存活的对象复制到幸存者区),只不过这次又会将存活的对象再次复制到S0区,并将留下来的对象age加1。此时将eden和S1的数据清空。

  5. 经过步骤2~步骤4 类似往复,每次YGC时,将存活的对象交替复制到S0和S1区,将eden和另一个幸存者区的数据清空。直到YGC后,幸存者区的对象有超过一定age(jdk8默认是15,可配置),这是会将对象复制到Old generation
    在这里插入图片描述

  6. YGC会持续不断的进行,所以对象也会持续不断地从Young generation复制到Old generation
    在这里插入图片描述

  7. 以上步骤几乎涵盖了Young generation的整个过程。 最后,当heap可用空间不足以给新建对象时则会进行Major GC,以清理和压缩空间。 至于何时进行Major GC,可参考:GC模式

参考:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html#t3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值