Full GC(完全垃圾回收)是Java虚拟机内存管理中最重要也最需要避免的性能瓶颈之一。作为Java开发者,深入理解Full GC的机制和优化方法,对于构建高性能应用至关重要。
一、Full GC 的本质与影响
1. Full GC 的定义
Full GC是指对整个Java堆(包括新生代、老年代)以及方法区(元空间)进行的全局垃圾回收。与只回收新生代的Minor GC相比,Full GC具有以下特点:
- 回收范围:整个堆内存 + 方法区
- 执行时间:通常比Minor GC长10倍以上(秒级)
- 停顿影响:会导致所有应用线程暂停(Stop-The-World)
2. Full GC 的性能影响
影响维度 | 具体表现 |
---|---|
响应延迟 | 可能导致数百毫秒甚至数秒的服务不可用 |
吞吐量 | 系统整体处理能力下降 |
稳定性 | 频繁Full GC可能导致OOM(OutOfMemoryError) |
用户体验 | 客户端应用可能出现明显卡顿 |
3. Full GC 的触发条件
Full GC并非单一事件,而是由多种情况触发:
-
老年代空间不足
- 新生代对象晋升时老年代剩余空间不足
- 大对象直接分配老年代时空间不足
-
方法区(元空间)不足
- 类加载信息占满元空间
- 字符串常量池膨胀
-
显式调用
- System.gc()调用(可通过-XX:+DisableExplicitGC禁用)
-
分配担保失败
- Minor GC前预测老年代剩余空间不足
-
并发模式失败(CMS)
- 并发收集器无法在堆满前完成回收