Java 对象分配过程

  • 对象分配是一个严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配的问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完是否会在内存空间中产生内存碎片。

新生代主要分为:Eden区和两个 Survio区 (下图的 S0 和 S1)

在这里插入图片描述

如上图:对象创建以后,先分配到 Eden 区,当Eden区放满了以后,开始垃圾回收(YGC/Minor GC),加入红色的对象不需要了,则进行释放,绿色的还有引用,则分配到 S0区(to区),然后对象的年龄计数器增加1。

在这里插入图片描述

Eden区继续存储对象,再次存储满了以后,进行YGC,无用对象被清除,绿色存在引用的对象和上面S0区的对象 统一都放入到 S1(to)区中,引用计数器增加1,然后S0 清空了,就这样反复.

在这里插入图片描述

当对象引用计数器的指达到15(默认的阈值位15),把这对象放入老年代。

s0和s1,复制之后有交换,谁空谁是to。
垃圾回收频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间收集。

注意:当 Eden 区满的时候,会触发 YGC 操作对 Eden和S0,S1进行GC操作,但是 Survio 满了不会触发 YGC。如果新声代放不下,可以考虑直接放到老年代,如果老年代也放不下了进行 FGC/Major GC,如果FGC以后还是放不下 报 OOM…

在这里插入图片描述

  • Minor GC 、 Major GC 、Full GC 区别

JVM在进行 GC 时,并非每次都对 (新生代、老年代、永久代/元空间)进行一起回收,大多数还是对新生代GC。
针对 HotSpot VM的实现,它里面的GC按照回收区域,又分为两大类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值