一、Minor GC是什么时候触发的?
new 出来的对象(除大对象外)直接在年轻代中的Eden区进行分配,如果Eden区域没有足够的空间,
那么就会触发YGC(Minor GC),YGC处理的区域只有新生代。
二、对象如何进入老年代?
1. 由-XX:PretenureSizeThreshold启动参数控制,若对象大小大于此值,就会绕过新生代, 直接在老年代中分配。
2.G1收集器中如果一个对象占用的空间超过了分区容量75%以上,就认为这是一个巨型对象。
这些巨型对象,默认直接会被分配在年老代
3. YGC时,To Survivor区不足以存放存活的对象,对象会直接进入到老年代。
4. 经过多次YGC后,如果存活对象的年龄达到了设定阈值,则会晋升到老年代中。
5. 动态年龄判定规则,To Survivor区中相同年龄的对象,如果其大小之和占到了 To Survivor区一半以上的空间,
那么大于此年龄的对象会直接进入老年代,而不需要达到默认的分代年龄
三、 FGC又是什么时候触发的?
1. 当晋升到老年代的对象大于了老年代的剩余空间时,就会触发FGC(Major GC)。
2. 老年代的内存使用率达到了一定阈值(可通过参数调整),直接触发FGC。
3. Metaspace(元空间)在空间不足时会进行扩容,当扩容到了-XX:MetaspaceSize 参数的指定值时,也会触发FGC。
4. System.gc() 或者Runtime.gc() 被显式调用时,触发FGC
FGC处理的区域同时包括新生代和老年代。
如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:java.lang.OutOfMemoryError: PermGen space