目录
一、什么是显式 GC?
(一) 垃圾回收的基本原理
(二)显式 GC 方法和行为
1. System.gc() 方法
2. 显式 GC 的行为
(三)显式 GC 的使用场景与风险
1. JVM 如何处理显式 GC
2. 显式 GC 的风险
二、显式 GC 对性能的影响
(一) 全 GC 与 STW
1. Full GC 是如何发生的?
2. STW(Stop-the-World)现象
3. Full GC 的性能开销
(二) 对 DirectByteBuffer 的影响
1. DirectByteBuffer 的垃圾回收问题
2. 显式 GC 的作用:避免内存泄漏
3. 禁用显式 GC 带来的问题
4. 解决方案:显式 GC 与优化参数
三、显式 GC 的争议
(一) 保留 System.gc():避免内存泄漏
1. DirectByteBuffer 和堆外内存的清理
2. 在长期运行的系统中避免资源泄漏
(二) 禁用 System.gc():减少性能损耗
1. 避免频繁的 Full GC 导致的 STW(Stop-the-World)停顿
2. 对 JVM 自适应回收策略的干扰
(三) 额外的 JVM 参数:优化显式 GC 的行为
1. -XX:+ExplicitGCInvokesConcurrent
2. -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
3. -XX:+UseConcMarkSweepGC 或 -XX:+UseG1GC
四、如何选择:留还是去?
(一) 保留显式 GC 的适用场景
1. 堆外内存管理需求
2. 需 要频繁类卸载的应用
3. 长时间运行的服务
(二)禁用显式 GC 的适用场景
1. 高并发、 低延迟要求
2. 现 代垃圾回收器的优化
3. 避免干扰自适应回收机制
(三) 如何优化显式 GC 以减少性能影响
1. 启用并发回收
2. 启用类卸载功能
3. 使用适合的垃圾回收器
五、小结
干货分享,感谢您的阅读!
在 Java 中,System.gc()是一种显式触发垃圾回收的方式。然而,是否应该在代码中显式调用它,却是一个有争议的话题。有些开发者建议禁用显式 GC,因为它会导致不必要的性能开销,而另一些开发者则认为它在特定场景下是必要的。本文将分析显式 GC 的影响,并给出推荐的实践策略。
历史主要基本文章回顾:
| 涉猎内容 | 具体链接 |
| Java GC 基础知识快速回顾 | Java GC 基础知识快速回顾-CSDN博客 |