Full GC(Full Garbage Collection)是指Java虚拟机(JVM)对整个堆内存(包括年轻代和老年代)以及方法区进行的垃圾回收。触发Full GC的情况有多种,以下是一些常见的触发条件:
1. 老年代空间不足
- 当老年代的空间不足以容纳新的对象时,会触发Full GC。
- 例如,一个大对象直接进入老年代,而老年代没有足够的空间来容纳它。
2. 方法区(永久代)空间不足
- 在JDK 8之前,方法区通常被称为永久代(Permanent Generation)。当永久代的空间不足时,会触发Full GC。
- 例如,加载了大量的类或常量池信息,导致永久代空间不足。
3. 系统显式调用System.gc()
- 当程序中显式调用
System.gc()方法时,JVM会尝试执行一次Full GC。 - 虽然不推荐这样做,因为这会影响性能,但有时在某些特定情况下可能会使用。
4. 年轻代GC后, Survivor 空间无法容纳存活对象
- 在年轻代进行Minor GC时,如果Survivor空间无法容纳所有存活的对象,这些对象会被晋升到老年代。如果老年代没有足够的空间,会触发Full GC。
5. 内存分配担保失败
- 在进行Minor GC时,JVM会检查老年代的最大可用连续空间是否大于历次提升到老年代对象的平均大小。如果小于,则会尝试进行一次Full GC,以确保有足够的空间进行对象晋升。
6. 使用了-XX:+UseConcMarkSweepGC(CMS收集器)
- CMS收集器在老年代空间剩余容量不足某个阈值时,会触发Full GC。
- 例如,当老年代剩余空间小于40%时,可能会触发Full GC。
7. 使用了-XX:+UseG1GC(G1收集器)
- G1收集器在某些情况下也会触发Full GC,例如当混合垃圾回收(Mixed GC)无法完成时。
示例代码
以下是一个简单的Java示例,展示了如何显式调用Full GC:
public class FullGCExample {
public static void main(String[] args) {
// 创建一个大对象,可能导致老年代空间不足
byte[] bigObject = new byte[1024 * 1024 * 10]; // 10MB
// 显式调用Full GC
System.gc();
// 输出提示信息
System.out.println("Full GC triggered");
}
}
在这个示例中,bigObject 是一个大对象,可能会导致老年代空间不足,从而触发Full GC。System.gc() 方法显式请求JVM进行一次Full GC。