1、核心作用
- 建议而非强制
- 调用 System.gc() 仅向 JVM 发送一个垃圾回收的“建议”,但 JVM 不保证立即执行。
- 最终,是否触发 GC、何时触发、使用哪种垃圾回收器(如:Serial GC、G1 GC 等)。
- 均由 JVM 自行决定。
- 底层实现
- System.gc() 实际调用的是 Runtime.getRuntime().gc(),二者功能等价。
2、使用场景(谨慎使用)
- 性能测试与调试
- 在内存敏感的性能测试中,手动触发 GC 以观察内存释放效果。
- 注意:需结合 -XX:+DisableExplicitGC 禁用自动 GC。
- 特殊资源释放
- 某些 Native 资源(如:堆外内存)可能依赖 GC 触发回收。
- 如:DirectByteBuffer 的清理。
- 此时,可尝试调用 System.gc()。
3、潜在问题
- 性能风险
- 垃圾回收可能导致 Stop-The-World(STW) 暂停。
- 尤其在 Full GC 时,应用线程会被挂起,影响响应时间。
- 频繁调用会干扰 JVM 的自动优化策略(如分代收集、动态调整 GC 频率)。
- 不可移植性
- 不同 JVM 实现(如 HotSpot、OpenJ9)对 System.gc() 的响应策略不同。
- 因此,代码行为可能不一致。
- 生产环境慎用
- 生产环境中通常禁用显式 GC(通过 JVM 参数 -XX:+DisableExplicitGC)。
- 避免人为引发性能波动。