什么时候触发full GC(发生场景)
文章目录
- 1. 老年代空间不足
- 2. 分配担保失败
- 3. 显式调用`System.gc()`
- 4. 元空间/永久代空间不足
- 5. CMS/G1的并发失败
- 6. 空间分配担保机制
- 7. 堆内存碎片化
- 8. 其他场景
- 总结回答
在Java中,Full GC(全局垃圾回收)会回收整个堆内存(包括年轻代、老年代)以及元空间(或永久代)。以下是触发Full GC的主要场景:
1. 老年代空间不足
- 对象晋升失败:当年轻代对象经过多次Minor GC后存活,晋升到老年代时,若老年代剩余空间不足,会触发Full GC。
- 大对象直接进入老年代:大对象(如长数组)可能直接分配在老年代,若老年代无法容纳,则触发Full GC。
2. 分配担保失败
- Minor GC前的检查:执行Minor GC前,JVM会检查老年代的连续空间是否大于年轻代存活对象总大小。若不足,可能触发Full GC(具体取决于垃圾收集器,如Parallel Scavenge)。
3. 显式调用System.gc()
- 代码中调用
System.gc()
或Runtime.getRuntime().gc()
可能触发Full GC(可通过-XX:+DisableExplicitGC
禁用)。
4. 元空间/永久代空间不足
- 元空间(Java