什么情况下会触发 Java 的 Full GC?

Sherwin.Wei Lv8

什么情况下会触发 Java 的 Full GC?

回答重点

以下几种情况可能会触发 Full GC:

1)老年代空间不足

  • 当老年代空间不足时(且无法通过老年代垃圾回收释放足够空间),会触发 Full GC 来回收老年代中的对象。

2)永久代或元空间空间不足

  • 在 Java 8 之前,如果永久代(PermGen)空间不足,会触发 Full GC。Java 8 之后,永久代被移除,元空间(Metaspace)取代了永久代。如果元空间(设置了阈值)内存不足,也可能触发 Full GC。

3)调用 System.gc()、jmap -dump 等命令

  • 显式调用 System.gc() 方法,建议 JVM 执行一次 Full GC,JVM 并不保证立即执行,但是可能触发。

4)空间分配担保(Promotion Failed)

  • 当新生代的 to 区放不下从 eden 和 from 拷贝过来对象或新生代的对象晋升到老年代时,如果老年代没有足够的空间来容纳这些对象,会发生 Promotion Failed,从而触发 Full GC。

5)新生代到老年代的晋升失败

  • 年轻代中的大对象或长期存活的对象被晋升到老年代,如果此时老年代空间不足,也会引发 Full GC。

6)年轻代平均晋升大小计算

  • 在要进行 young gc 的时候,根据之前统计数据发现年轻代平均晋升大小比现在老年代剩余空间要大,那就会触发 full gc。

扩展知识

如何减少 Full GC 的触发

  • 调整堆内存大小:通过调整堆内存大小(-Xms-Xmx 参数)来减少老年代空间不足的情况。
  • 增大新生代大小:增加新生代的大小,减少对象晋升到老年代的频率。
  • 优化对象分配和生命周期:通过分析对象的生命周期,减少长时间存在的大对象,优化应用的内存使用模式。
  • 合理设置元空间大小:避免元空间过小导致频繁的 Full GC,可以使用 -XX:MetaspaceSize-XX:MaxMetaspaceSize 参数进行配置。

永久代与元空间

Comments