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

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

Full GC(完全垃圾回收)是 Java 中的一个重要垃圾回收阶段,它会回收 整个堆内存,包括 新生代老年代。触发 Full GC 的条件通常比 Young GC 更为复杂且影响较大,因为它会导致 JVM 停顿时间较长。下面是一些常见的触发 Full GC 的情况:


1. 老年代内存不足

  • 老年代 的内存空间不足时,JVM 会触发 Full GC
  • 在垃圾回收过程中,如果 新生代 的回收没有释放足够的内存空间供老年代使用,或者 老年代 的对象数量增多导致空间耗尽时,会触发 Full GC

例子:

  • Minor GC 后,如果新生代的对象经过若干次晋升后占用了大量的老年代空间,老年代内存不足时,会触发 Full GC

2. 长时间没有进行过 Full GC

  • 如果 JVM 在长时间内没有执行过 Full GC,并且 新生代老年代 的内存空间都已经满了,JVM 会自动触发 Full GC 来释放内存。

例子:

  • 如果一个应用程序长期运行并且 Minor GC 无法回收足够的内存来供老年代使用,可能会触发 Full GC

3. 调用 System.gc()

  • 如果显式调用了 System.gc() 方法,JVM 会尝试执行 Full GC
  • 这个方法虽然建议避免使用,因为它会增加不必要的性能开销,但仍然会强制进行 Full GC

例子:

System.gc();  // 强制调用 Full GC

4. 内存溢出(OutOfMemoryError)

  • 当 JVM 遇到内存溢出的情况时,可能会触发 Full GC。例如,当老年代空间不足以存放对象时,Full GC 会被触发。但如果内存依然不足,最终会抛出 OutOfMemoryError

例子:

  • 当老年代的空间无法为新对象分配内存时,JVM 会尝试进行 Full GC,但如果回收后仍然无法满足要求,就会抛出内存溢出异常。

5. JVM 参数的调整

  • 某些 JVM 参数的调整可能会导致 Full GC 的触发。例如:
    • -XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio:控制堆内存空闲比例,可能会触发 Full GC
    • -XX:SurvivorRatio:调整 Survivor 区Eden 区 的比例,如果调整后内存压力较大,可能会触发 Full GC

例子:

  • 修改 -Xmx-Xms 参数时,JVM 可能会执行 Full GC 来调整堆内存大小。

6. 堆内存的配置发生变化

  • 修改堆内存配置,如 最大堆内存大小初始堆内存大小,可能会导致堆内存的重新分配,从而触发 Full GC

例子:

  • 修改启动参数 -Xmx-Xms 时,JVM 会重新分配堆内存,可能会触发 Full GC

7. 垃圾回收器的切换

  • 在一些情况下,当 JVM 切换垃圾回收器时,例如从 Parallel GC 切换到 G1 GC,也可能触发一次 Full GC 来适应新的垃圾回收策略。

例子:

  • 启用 -XX:+UseG1GC 配置时,JVM 可能会执行一次 Full GC 来完成策略调整。

8. 类加载过程

  • 在类加载过程中,尤其是当加载大量类时,如果内存不足,JVM 会触发 Full GC 来释放空间。特别是在 Metaspace(JDK 8 及以后)或 PermGen(JDK 7 及以前)空间不足时,可能会发生 Full GC

例子:

  • 动态加载大量类时,可能会导致 Metaspace 空间不足,从而触发 Full GC

总结

触发条件 描述
老年代内存不足 当老年代空间不足时,触发 Full GC
长时间未执行 Full GC 如果长时间没有进行过 Full GC,内存压力增大时会触发。
调用 System.gc() 显式调用 System.gc() 方法会触发 Full GC
内存溢出(OutOfMemoryError) 当内存溢出发生时,Full GC 会被触发来尝试回收内存。
JVM 参数调整 修改堆内存大小或其他内存参数时,JVM 可能会触发 Full GC
堆内存配置变化 堆内存的配置发生变化时,JVM 可能会执行一次 Full GC
垃圾回收器切换 在垃圾回收器切换时,可能会触发 Full GC
类加载过程 在加载类时,如果内存不足,也可能触发 Full GC

结论:

Full GC 是在堆内存出现压力时,特别是老年代空间不足时触发的,它会回收整个堆内存,包括新生代和老年代。由于 Full GC 会导致较长时间的停顿,因此在应用中需要尽量避免频繁触发。

posted @   Eiffelzero  阅读(367)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2022-12-11 1827. 最少操作使数组递增
点击右上角即可分享
微信分享提示