Minor GC与Full GC分别在什么时候发生?

FullGC 一般是发生在老年代的GC,出现一个FullGC经常会伴随至少一次的Minor GC。速度比MinorGC慢10倍以上。

FUll GC

FULL GC发生的情况:

  • 1) 老年代空间不足 老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space.

措施:为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组

  • 2) Permanet Generation(方法区或永久代)空间满 PermanetGeneration中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:java.lang.OutOfMemoryError: PermGen space

措施:为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

  • 3) CMS GC时出现promotion failed和concurrent mode failure 对于采用CMS进行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;

    concurrent mode failure: CMS在执行垃圾回收时需要一部分的内存空间并且此刻用户程序也在运行需要预留一部分内存给用户程序,如果预留的内存无法满足程序需求就出现一次"Concurrent mod failure",并触发一次Full GC。

    应对措施为:增大survivor space、老年代空间或调低触发并发GC的比率,

  • 4) 空间分配担保 统计得到的Minor GC晋升到老年代的平均大小大于老年代的剩余空间,Hotspot为了避免由于新生代对象晋升到老年代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断。如果之前统计所得到的Minor GC晋升到老年代的平均大小大于老年代的剩余空间,那么就直接触发Full GC。如果小于并且不允许担保失败也会发生一次Full GC。

MinorGC

MinorGC 指发生在新生代的垃圾收集动作,非常频繁,回收速度也快。一般发生在新生代空间不足时,另外一个FullGC经常会伴随至少一次的Minor GC. 当虚拟检测晋升到到老年代的平均大小是否小于老年代剩余空间大小,如果小于并且允许担保失败,则执行Minor GC.

标签: gc、年代、full、minor、cms、面试
  • 回复
隐藏