什么时候会触发 Full GC?

Full GC的触发条件有多个,具体如下:

  • Young GC 之前检查老年代:在进行Young GC之前,如果发现老年代的可用连续内存空间小于新生代历次Young GC后升入老年代的对象总和的平均大小,即本次Young GC后升入老年代的对象大小可能超过了老年代当前可用内存空间,那么就会触发Full GC。
  • Young GC 之后老年代空间不足:在执行Young GC后,如果有一批对象需要放入老年代,但是老年代没有足够的内存空间来存放这些对象,那么就必须立即触发一次Full GC。
  • 老年代空间不足:当老年代的内存使用率达到一定比例,即使用的内存超过了阈值,会触发Full GC。
  • 空间分配担保失败(Promotion Failure):如果新生代的To区无法容纳从Eden和From区复制过来的对象,或者新生代对象的年龄达到晋升的阈值,而老年代也无法容纳这些对象,就会触发Full GC。
  • 方法区内存空间不足:如果方法区由永久代实现,当永久代的空间不足时,会触发Full GC。
  • 手动触发:通过执行System.gc()等命令,或者使用jmap -dump等命令,可以手动触发Full GC。

这些条件的存在使得虚拟机在合适的时机执行Full GC,以确保内存空间的充分利用和垃圾对象的有效回收。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题