整个GC过程中应该考虑的问题

到底什么时候会尝试Minor GC?

新生代填满到90%的时候:

同时,说出为什么 新生代是 8:1:1比例;最大化的利用新生代空间;

触发Minor GC之前会如何检查老年代大小,涉及哪几个步骤和条件?

MinorGC之前,发现老年代的可用内存已经小于新生代的全部对象大小,则会看一个参数: -XX:-HandlePromotionFailure 是否配置了;

如果有则进行下一步尝试,看看老年代的内存大小,是否大于之前每一次MinorGC后进入老年代的对象平均大小;

 

整个GC过程中应该考虑的问题_第1张图片

什么时候在Minor GC之前就会提前触发一次Full GC?

如果上面这个步骤判断失败了,或者说 -XX:-HandlePromotionFailure参数没有配置,则会直接触发一次Full GC,就是对老年代进行垃圾回收,尽量腾出来一些内存空间,然后再执行MinorGC.

FullGC的算法是什么?

标记整理算法

MinorGC后 可能会面对哪几种情况?

如果上面步骤判断成功,则可以冒风险尝试一下MinorGC,此时进行MinorGC有几种可能.

1.MinorGC后,剩余的存活对象的大小,是小于Survivor区域的大小的,那么此时存活对象进入Suivivor区域即可.

2.MinorGC后,剩余的存货对象的大小,是大于Suivivor区域的大小的,但是是小于老年代可用内存大小的,此时就直接进入老年代即可;

3.很不幸,MinorGC后,剩余存活对象的大小,大于了Survivor区域的大小,也大于了老年代可用内存的大小。此时老年代都放不下这些存活对象了,就会发生"Handle Promition Failure"的情况,这个时候就会触发一次"Full GC".

FullGC 对老年代进行垃圾回收,同时也对新生代进行垃圾回收;

此时必须把老年代里没有人引用的对象给回收掉,然后才可用让MinorGC过后剩余的存活对象进入老年代里面.

如果FullGC后,老年代还是没有足够的空间存放MinorGC后的剩余存活对象,那么此时就会导致所谓的OOM内存溢出了;

哪些情况下,MinorGC后的对象会进入老年代?

MinorGC后的对象太多无法放入Survivor区域,需要直接放入老年代;

对老年代触发垃圾回收的时机?

1.MinorGC之前,一通检查发现很可能MinorGC之后要进入老年代的对象太多了,老年代放不下,此时需要提前触发FullGC然后再带着进行MinorGC;

2.要不然是在MinorGC之后,发现剩余对象太多放入老年代 都放不下了.

你可能感兴趣的:(深入理解JVM相关知识)