通俗易懂讲解JVM之新生代GC、老年代GC、永久代GC的触发时机

新生代GC

新生代GC一般在Eden区域满了后就会触发GC

老年代GC

1.执行MinorGC之前进行检查,如果“老年代连续可用内存空间大小<历次新生代MinorGC后进入老年代的平均对象大小”,说明此次"MinorGC后进入老年代的对象大小" 可能超过 "老年代连续可用内存空间大小",此时会触发一次OldGC让老年代腾出更多的内存空间,然后再执行MinorGC

2.执行一次MinGC后存活的对象在Survivor放不下此时会把存活对象直接放入老年代(或者根据动态年龄判定法而进入老年代),并且老年代此时剩余的连续可用内存空间大小也不足以放下这些对象,此时必然会触发一次OldGC

3.老年代内存使用率超过了92%(参数可配),那么直接触发OldGC。

永久代GC

如果执行一次FullGC时,发现永久代满了,也会进行回收掉永久代的垃圾。永久代存放类信息、常量池,所以一般来说它的垃圾时非常少的。

一些补充

其实一次OldGC必然连带着一个MinorGC,根据老年代GC的触发条件不同,MinorGC要么跟在OldGC之前,要么在之后。

 

你可能感兴趣的:(JVM)