优化 JVM 吞吐量和避免运行时瓶颈的最佳方法是将 Java 性能分析作为团队持续开发和部署 (CI/CD) 策略的关键部分。以下是五个 Java 性能分析技巧和最佳实践,可帮助你充分利用本地硬件和云托管运行时环境。
1.永远不要关闭Java性能分析
Java Flight Recorder 是一个非常高效的 Java 性能分析工具,直接内置在 JVM 中。它是轻量级的,对正在运行的应用程序的影响最小。
默认设置对性能的影响不到 1%,而即使是最极端的数据收集设置,其消耗也仅略高于 2%。鉴于任何生产服务器都不应该在任何延长的时间内承受 50% 的负载这一事实,应该始终有足够的可用资源来保持 Java Flight Recorder 在后台运行。
这种配置的好处是,当发生 JVM 崩溃或应用程序遇到灾难性的运行时故障时,可以查看导致灾难的所有事件的记录。即使在负载较重的生产系统上,Java 性能分析器也应该始终运行。事实上,当 JVM 处于极端负载下时,正是从 Java 性能分析工具获取的指标最有用的时候。
2.知道何时选择采样而不是仪器
有两种不同的方法来监视和分析 JVM:采样和检测。
使用采样方法的 Java 性能分析器将在运行时对 JVM 施加更可预测的负载。因此,在 JVM 的字节码调用中搜索模式时,最好使用基于采样的分析器。
仪器分析仪更精确,并且在其应用中更具外科手术性。借助仪器,软件架构师可以将额外的代码或组件添加到系统中。他们将这些工具添加到他们认为可能是性能问题来源的位置。因为仪器被插入到应用程序代码中或嵌入在 JVM 中,所以每次遇到时都会触发它们。
当你很好地了解问题是什么以及问题在代码库中的位置时,基于检测的分析器往往会更有效。战略性地使用采样和基于检测的分析器将带来最佳的 Java 性能优化结果。
3.使用 AI 增强 JVM 性能问题分析
无论是内存泄漏还是线程死锁,大多数 Java 性能问题都遵循众所周知的行为模式。在花费大量时间检查 JVM 堆直方图或检查 Java GC 暂停时间之前,请通过可以将某种程度的 AI 应用于文件的分析工具运行 Java 性能分析器数据。
大多数 Java 性能分析工具将能够快速对困扰你的应用程序的瓶颈类型进行分类,甚至可以识别出降低吞吐量和延迟的实际代码行。
4. 在版本控制中保持性能基准
性能数据历史将帮助你识别 Java 性能指标中的模式。
为你的应用程序创建一个性能测试套件,将其作为每个持续集成构建的一部分运行,并确保你在后台打开了 Java Flight Recorder。然后将生成的 Flight Recorder 数据文件作为 CI/CD 构建的一部分保存在 Git 或 GitHub 中。
这种 Java 性能分析策略不仅为你的应用程序创建了一个性能基准,而且还为你提供了一个历史记录,你可以在其中查看趋势如何随着时间的推移而出现。你可能无法从一个 sprint 到下一个 sprint 中识别出一个迫在眉睫的性能问题,但是在一系列几周或几个月内比较 JVM 分析器数据将有助于发掘模式。
此外,告诉开发人员,如果性能指标超出可接受的范围,那么它被认为是一个损坏的构建。让开发人员在开发生命周期的早期考虑非功能性需求,例如性能和安全性。
5. 现代化你的 Java 分析工具
当谈到 Java 性能分析工具时,不要拘泥于自己的方式。
10 年前可能对部署到 WebSphere 或 Tomcat 服务器的应用程序进行故障排除有效的工具在对部署到 Docker 容器的基于微服务的应用程序进行故障排除方面将不那么有效。在过去的 10 年中,应用程序开发、设计和部署的世界发生了巨大变化,你使用的 Java 性能分析工具也需要随之改变。
VisualVM 仍然是一种流行的 Java 性能分析和监控工具,但 Java Mission Control 等新的分析工具提供了可视化和检查 JVM 指标的更新方法。当字节码封装在 Docker 容器中并部署到 Kubernetes 集群时,许多供应商专门分析 JVM 运行时。始终确保你使用的分析工具符合你的 Java 性能分析需求。
坚持这些 Java 性能分析技巧,并在即将出现的可能会降低应用程序吞吐量的 JVM 瓶颈之前保持领先一步。