本文将与您分享一些 JVM“流行语”,Java 开发人员在执行任何 JVM 性能和垃圾收集调优之前必须了解和记住这些流行语。还提供了一些技巧,包括文章末尾的一些高级性能调整最佳实践。有关 Oracle HotSpot 并发 GC 收集器(如 CMS 和 G1)的更多建议将在以后的文章中探讨。
在进一步阅读之前,我建议您首先熟悉 JVM 详细 GC 日志。掌握这种 JVM 数据分析技能是必不可少的,尤其是在结合更高级的 APM 技术时。
JVM 流行语
分配率 | 分配给 YoungGen 空间的 Java 对象,也称为“短命”对象。 |
晋升率 | 从 YoungGen 提升到 OldGen 空间的 Java 对象。 |
实时数据 | 位于 OldGen 空间中的 Java 对象,也称为“长寿命”对象。 |
停止世界收藏 |
Full GC 等垃圾收集会导致您的应用程序线程暂时挂起,直到完成为止。 |
要事第一:JVM GC 日志
- 提供有关 Java 堆和 GC 活动的开箱即用的细粒度详细信息。
- 使用 GCMV (GC 内存可视化工具)等工具来评估您的 JVM 暂停时间和内存分配率,而不是手动调整各代的大小。
分配和促销率
- 跟踪您的应用程序分配和提升率以获得最佳 GC 性能非常重要。
- 作为 JVM 人体工程学的一部分,保持 GCAdaptiveSizePolicy 处于活动状态。仅在需要时手动调谐。
实时数据计算
- 您的实时应用程序数据对应于 Full GC 后的 OldGen 占用率。
- 您的 OldGen 容量必须足够大以轻松保存您的实时数据并限制主要收集的频率和对您的应用程序负载吞吐量的影响。
建议 :作为起点,调整您的 Java 堆大小,以便在 Full GC 后实现 OldGen 足迹或占用率大约 50%,从而为某些更高负载的场景(故障转移、峰值、繁忙的业务周期……)留出足够的缓冲区。 .).
-
*热点* :注意 OldGen 内存泄漏! - 什么是 Java 中的内存泄漏?随着时间的推移,实时数据 不断增加 ......
实时数据深入研究
- JVM GC 日志很棒……但是如何检查实时数据?
- Java 堆直方图快照和 JVM 堆转储 分析是功能强大且经过验证的方法,可以更好地了解您的应用程序实时数据。
- Java 探查器解决方案和工具(例如 Oracle Java Mission Control 、Java Visual VM)为深度 Java 堆检查和分析提供了高级功能,包括跟踪您的应用程序内存分配。
Stop-the-world 集合:GC 开销
- YoungGen 集合成本较低,但要小心 分配率过高 。
- 建议将 YoungGen 的初始大小(JVM 默认值)设置为堆大小的 1/3。
- 请记住:YoungGen 和 OldGen 集合都是停止世界事件!
- PermGen 和 Metaspace (JDK 1.8+) 在 Full GC 期间收集,因此跟踪类元数据足迹和 GC 频率很重要。
最后的话和建议
最佳实践
- 最佳 Java 性能不仅仅与 Java 有关……探索所有角度。
- 始终依靠事实而不是猜测。
- 首先关注全局调整项,而不是过早的细粒度优化。
- 适用时执行性能和负载测试。
- 利用可用的成熟工具和故障排除技术。
避免
- 有许多可能的 JVM 参数:不要过度调整您的 JVM!
- 你总是害怕你不了解的东西:良好的应用知识 > 无所畏惧 > 更好的调优建议。
- 永远不要假设您的应用程序性能是最佳的。
- 不要试图一次解决所有问题,逐步实施调整。
- 不要感到困惑,要专注于性能问题的根本原因,而不是症状。
- 过度试错法:猜测的症状。