对象分配过程

对象分配过程

  • 为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者门不不仅要考虑内存如何分配,在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片
  • 在这里插入图片描述
  1. new出来的对象首先放到伊甸园区
  2. 直到伊甸园区满了,就会触发一次GC(YGC/Minor GC),将没有被引用的对象回收,同时将伊甸园区中还存活的对象移到Survivor区(此时s0和s1都是空的),并且这些存活的对象被打上标记1(表示经历过1次GC),此时伊甸园区就空了.
  3. 伊甸园区再次满了,继续触发GC(YGC/Minor GC),也是把伊甸园区的垃圾回收,然后幸存者会被移到另一个Survivor区(即to区,上一次已经占了一个,所以现在只有一个是空的,谁空谁是to),同时,这一次GC也会对from区(即上一次幸存者存放的区域)进行判断,没有被引用的回收,幸存的移到另一个Survivor区,并且标记+1,这样就保证了,S0或者S1始终有一个是空的,空的就是to区,另一个就是from区,S0和S1交替成为to区
  4. from区的GC是被动的,伊甸园区触发了GC,from区才会GC,当from区中有对象的标记达到了15(阈值,-XX:MaxTenuringThreshold=15)的时候,就会把这个对象移到老年代
  • 总结: 关于垃圾回收,频繁在新生区收集;很少在老年区收集;几乎不在永久区/元空间收集
对象分配策略(或对象晋升(Promotion)规则)
  • 优先分配到Eden
  • 大对象直接分配到老年代
    • 尽量避免程序中出现过多的大对象
  • 长期存活的对象分配到老年代
  • 动态对象年龄判断
    • 如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄
  • 空间分配担保
    • -XX:HandlePromotionFailure
空间分配担保
  • 在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间
    • 如果大于,则此次Minor GC是安全的
    • 如果小于,则虚拟机会查看-XX:HandlePromotionFailure设置值是否允许担保失败
      • 如果设置为true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象平均大小
        • 如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的(其实这个参数的作用是,这次判断是通过平均来判断的,所以依然有风险,你是否为这次GC的风险作担保,不担保的话,直接进行Full GC)
        • 如果小于,则改为一次Full GC
      • 如果设置为false,则改为进行一次Full GC
      • 如果设置为false,则改为进行一次Full GC
  • 在JDK6 Update24之后(JDK7),HandlePromotionFailure参数不会再影响到虚拟机的空间分配担保策略,观察OpenJDK中的源码变化,虽然源码中还定义了HandlePromotionFailure参数,但是在代码中已经不会再使用它,JDK6 Update24之后的规则变为只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC,其实就是把参数始终设置为ture
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

climb.xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值