图解对象分配的过程


前言

new一个对象实例时,首先是存入堆中新生代中的伊甸园区,如果伊甸园区空间满了,就会进行YGC,本篇文章就讲述一下对象的分配过程是如何的…

一般过程

第一次轻GC

在这里插入图片描述

  1. new的对象先放着伊甸园区;
  2. 当伊甸园区空间满了时,程序又要创建新的对象时,JVM垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区的不再被其他对象所引用的对象进行销毁,再加载新的对象到伊甸园区;
  3. 然后将伊甸园区剩余的对象移动到幸存者0区,每个对象被分配了一个年龄计数器(age),每进行一次GC,幸存下来的对象age累加,上面的两个幸存对象age被赋值为1;
  4. GC完成后,此时伊甸园区是空的了。

说明:

  1. S0区和S1区,也被叫做From区和To区,判断二者很简单,谁是空的谁是To,则另外一个就是From区;
  2. 每次GC时,幸存的对象则会被放入To区,以上面的为例,第一次GC时,S0是To区,当GC完成后,S1区是空的就变成了To区;

第二次轻GC

在这里插入图片描述

  1. 当伊甸园区空间又满了时,进行第二次GC,将伊甸园区幸存的对象放入S1区,age此时为1;

  2. 同时对S0区的对象进行判断是否还被使用,如果被使用的话,就将其放入S1区,age累加此时为2;

  3. 第二次GC完成后,S0区为空了,此时S0区为To区,S1区为From区;

第N次GC

在这里插入图片描述

  1. 第N次GC时,我们发现S1区的有两个对象的age已经是15了,如果此时这两个对象还是被引用的,则将其晋升到Old区;
  2. 其中15为默认阈值,这个阈值是可以自己设置:-XX:MaxTenuringThreshold=<N>

特殊过程

在这里插入图片描述

  1. 创建一个新的对象时,首先判断Eden区是否放的下,如果放的下,就为其分配内存,放不下的话,就进行YGC;
  2. 然后再判断Eden区是否放的下,如果此时放的下的话,就为其分配内存,如果还是放不下,说明这个对象比伊甸园区的空间还要大,这个对象是个超大对象,此时将其放入Old区,如果Old区也放不下,就进行FGC,然后再判断Old区能不能放下,放的下就存在Old区,如果还是放不下,就会出现OOM异常;
  3. 在进行YGC的时候,幸存的对象会放入幸存区,此时判断是否能放下,如果幸存区放不下,就会直接放入Old区。

总结

  1. 什么时候进行GC呢?当伊甸园区满的时候才会进行GC,幸存区满的时候不会进行GC,只有当伊甸园区满的时候,幸存区才会被动进行GC。

  2. 关于幸存者S0和S1区:复制之后有交换,谁空谁是To;

  3. 对于垃圾回收:频繁在新生区进行回收,很少在老年区收集,几乎不在永久区/元空间收集。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值