FullGC 的执行
- 执行 Minor GC 的时候,JVM 会检查老年代中最大连续可用空间是否大于了当前新生代所有对象的总大小
- 如果大于,则直接执行 Minor GC(这个时候执行是没有风险的)
- 如果小于了,JVM 会检查是否开启了空间分配担保机制,如果没有开启则直接改为执行 Full GC
- 如果开启了,则 JVM 会检查老年代中最大连续可用空间是否大于历次晋升到老年代中的平均大小,如果小于则执行改为执行 Full GC
- 如果大于则会执行 Minor GC,如果 Minor GC 执行失败则会执行 Full GC
进入老年代的对象
- 大对象会直接进入老年代(避免频繁复制)
- 在程序中长期持有了对象的引用(对象年龄达到指定阈值也会进入老年代)
- survivor 区太小,只能进入老年代
频繁出现排查方法
开启 -XX:+HeapDumpBeforeFullGC
用 Java VisualVM 工具分析
频繁出现可能原因
- 对象引用长期未释放
- survivor 区太小
- old 区太小