在什么样的场景下,JVM会执行Ful GC?
Full GC,也被称为全局垃圾收集,主要是对Java堆内存中的新生代和老年代进行的垃圾收集。Full GC通常会比Minor GC花费更多的时间,因为它需要检查整个堆空间。
以下是一些可能触发Full GC的情况:
- 老年代空间不足:如果新生代中存活的对象空间大于老年代的连续空闲空间,或者Minor GC后老年代的空间利用率超过了某个阈值,就会触发Full GC。
-
永久代(PermGen)或元空间(Metaspace)空间不足:如果要加载新的类,但是PermGen或Metaspace的空间不足,就会触发Full GC。这种情况在Java 8之前更为常见,因为Java 8已经移除了永久代,使用元空间来存储类的元数据,并且元空间的大小默认只受限于系统内存。
-
手动触发:如果调用了System.gc()方法,或者使用了一些工具来请求垃圾收集,也会触发Full GC。
-
使用了某些JVM参数:例如,如果使用了-XX:+UseSerialGC参数,每次Minor GC后都会进行Full GC。
尽管Full GC可以清理整个堆空间,但是由于它的开销较大,所以一般来说我们会尽量避免Full GC的发生。通过合理的内存设置和垃圾收集器选择,可以降低Full GC的频率,从而提高应用的性能。