什么是空间担保?

简单解释

内存分配的一种机制,Young区空间容纳不了对象时会把对象放到Old区,所以称之为Old区给Young区的空间做担保。继续联想。。。。java堆内存会使用谁来做空间担保呢?

官方解释

在发生Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总 空间,如果这个条件成立,那这一次Minor GC可以确保是安全的。如果不成立,则虚拟机会先查看- XX:HandlePromotionFailure参数的设置值是否允许担保失败(Handle Promotion Failure);如果允 许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大 于,将尝试进行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者-XX: HandlePromotionFailure设置不允许冒险,那这时就要改为进行一次Full GC。

---- 《深入理解java虚拟机》

伪代码

if(老年代最大可用的连续空间 < 新生代所有对象的总空间) {
      if(HandlePromotionFailure == true) {
            if(老年代最大可用连续空间 > 历次晋升到老年代的对象的平均大小) {
                  YGC(); // 尝试进行一次 YGC,但这次 YGC 依然是有风险的
            } else {
                  FGC();
            }
      } else {
            FGC();
      }
} else {
      YGC(); // 此次 YGC 安全
}
posted @ 2020-07-16 21:58  林一gg  阅读(307)  评论(0编辑  收藏  举报