Q:到底什么时候会尝试触发Minor GC?
R:Eden区和存对象的Survivor区满的时候触发Minor GC
触发Minor GC情况有:
检查新生代对所有对象所占空间是否大于老年代可用空间,如果小于,则Minor GC
如果大于,查看“-XX:-HandlePromotionFailure”是否设置。
如果没设置,进行Full GC。
如果设置,判断老年代空间是否大于之前Minor GC后进入老年代对象的平均大小。如果大于,进行Minor GC,如果小于进行Full GC。
Q:触发Minor GC之前会如何检查老年代可用内存大小和新生代对象大小?
R:1.判断新生代存活是否大于老年代剩余
2.条件1成立且设置了空间担保的情况下,判断老年代剩余是否大于之前进入老年代平均存活大小。
Q:什么时候再Minor GC之前就会提前触发一次Full GC?
R:新生代现有存活对象>老年代剩余内存情况下,设置空间担保 “-XX:-HandlePromotionFailure”,老年代可用空间大于之前每次Minor GC后进入老年代的平均大小。就会先Full GC再Minor GC。
Q:Full GC的算法是什么?
R:标记整理算法,老年代对象存活时间较长,赋值算法不太合适,标记-清理算法会产生内存碎片。标记整理可以规避。
Q:Minor GC过后可能对应几种情况?
R:1、小于Survivor区域,进入Survivor区域
2、大于Survivor区域,小于老年代可用内存,进入老年代
3、大于Survivor区域,大于老年代可用内存,进行Full GC,如果Full GC 后老年代可用内存依旧小于存活对象,抛出OOM即堆内存空间不足,堆内存溢出。
Q:如何检查老年代可用内存大小和历次Minor GC之后升入老年代的平均对象大小?
R:
Q:什么情况下Minor GC后会直接进入老年代
R:Survivor区域<存活对象占用空间 && 老年代可用空间<存活对象占用空间
经过XX:MaxTenuringThreshold 次 M
每次Minor GC 前直接检查新生代全部对象的大小是否小于老年代可用内存大小。