什么情况下会触发 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 会导致较长时间的停顿,因此在应用中需要尽量避免频繁触发。
分类:
Java / JVM
, 面试题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2022-12-11 1827. 最少操作使数组递增