1. 概述

有时候代码能跑通还不够。 我们可能需要了解内部运行机制,比如内存分配情况、不同编码方式的性能差异、并发执行的影响、性能优化点等。这时就需要性能分析工具(Profiler)。

Java Profiler 是一种在 JVM 层面监控 Java 字节码构造和操作的工具。这些构造和操作包括对象创建、迭代执行(含递归调用)、方法执行、线程状态和垃圾回收。

本文将探讨主流的 Java Profiler:JProfilerYourKitJava VisualVMNetbeans ProfilerIntelliJ Profiler

2. JProfiler

JProfiler 是许多开发者的首选。凭借直观的界面,它提供了系统性能、内存使用、潜在内存泄漏和线程分析的可视化视图。

通过这些信息,我们能快速定位需要优化、消除或修改的系统底层问题。

该工具需要购买许可证,但提供免费试用。

以下是 JProfiler 的界面: jprofiler overview probing JProfiler 功能概览界面

与大多数 Profiler 类似,它支持本地和远程应用分析。这意味着可以分析远程机器上的 Java 应用而无需安装任何客户端

JProfiler 还提供SQL 和 NoSQL 数据库的高级分析功能,专门支持 JDBC、JPA/Hibernate、MongoDB、Cassandra 和 HBase。

下图展示了 JDBC 分析界面,包含当前连接列表: jprofiler database probing 1 JProfiler 数据库分析视图

当我们需要查看数据库调用的调用树发现可能泄漏的连接时,JProfiler 能轻松搞定。

Live Memory 是 JProfiler 的核心功能,允许我们实时查看应用的内存使用情况。可以按对象声明、实例或完整调用树查看内存使用。

对于分配调用树,可选择查看存活对象、已回收对象或两者的调用树。还能指定分析特定类/包或所有类的分配树。

下图展示了所有对象的实时内存使用情况(含实例计数): jprofiler live memory JProfiler 实时内存视图

JProfiler 支持与主流 IDE 集成(如 Eclipse、NetBeans 和 IntelliJ),甚至支持从快照直接跳转到源代码

3. YourKit

YourKit Java Profiler 支持多平台,为每个操作系统(Windows、macOS、Linux、Solaris、FreeBSD 等)提供独立安装包。

与 JProfiler 类似,YourKit 的核心功能包括线程可视化、垃圾回收分析、内存使用和内存泄漏检测,并支持通过 SSH 隧道进行本地和远程分析

YourKit 提供商业付费许可证(含免费试用),非商业用途则提供低价或免费许可。

以下是 Tomcat 应用的内存分析结果: yourkit tomcat profiling memory YourKit 分析 Tomcat 应用的内存使用情况

当需要分析抛出的异常时,YourKit 也很有用。它能快速统计异常类型和发生次数。

YourKit 的CPU 分析功能支持聚焦代码特定区域(如方法或线程子树),通过其"假设分析"(what-if)功能实现条件分析,非常强大。

下图展示了线程分析界面: yourkit threads profiling YourKit 线程分析界面

YourKit 同样支持SQL 和 NoSQL 数据库调用分析,甚至能展示实际执行的查询语句。

虽然不是技术考量,但其宽松的许可模式使其成为多用户/分布式团队或单许可购买的理想选择。

4. Java VisualVM

Java VisualVM 是一个简化但强大的 Java 应用分析工具,属于免费开源工具

该工具曾随 JDK 一起发布(JDK 8 及之前),但从 JDK 9 开始被移除,现在作为独立工具分发:VisualVM 下载

其运行依赖 JDK 中的其他工具(如 JConsole、jstat、jstack、jinfo 和 jmap)。

下图展示了 Java VisualVM 的分析会话概览: visualvm overview Java VisualVM 分析本地 Tomcat 应用

Java VisualVM 的一个显著优势是可通过插件扩展新功能,并能将插件添加到内置的更新中心。

它支持本地和远程分析(含内存和 CPU 分析),但远程连接需提供凭证(主机/IP 和密码),不支持 SSH 隧道。可启用实时分析(通常每 2 秒更新一次)。

下图展示了 Java 应用的内存分析结果: visualvm sample memory Java VisualVM 内存堆直方图

通过快照功能,可保存分析会话快照供后续分析

5. NetBeans Profiler

NetBeans Profiler 随 Oracle 开源的 NetBeans IDE 一起发布

虽然它与 Java VisualVM 功能高度相似,但当需要将所有工具集成在一个程序中(IDE + Profiler)时,它是理想选择。前述其他 Profiler 均通过插件增强 IDE 集成。

下图展示了 NetBeans Profiler 的界面: netbeans telemetry view NetBeans Profiler 遥测界面

NetBeans Profiler 也是轻量级开发和分析的不错选择。它提供单一窗口配置和控制分析会话,并展示结果。其独特功能是能统计垃圾回收发生频率

6. IntelliJ Profiler

IntelliJ Profiler 是一个简单但强大的 CPU 和内存分配分析工具,结合了两大流行 Java Profiler 的能力:JFR 和 Async Profiler。

尽管有高级功能,但核心目标是易用性。IntelliJ Profiler 无需任何配置,点击几下即可启动,同时提供日常开发所需的实用功能。

作为 IntelliJ IDEA Ultimate 的一部分,IntelliJ Profiler 可一键附加到进程,并能像操作源代码一样在快照和代码间导航。其差分火焰图等功能,可快速高效地可视化评估不同方案的性能:

IntelliJ Profiler 火焰图示例 IntelliJ Profiler 差分火焰图

IntelliJ Profiler 支持 Windows、Linux 和 macOS。

7. 其他优秀 Profiler

值得关注的工具还有 Java Mission ControlNew RelicPrefix(来自 Stackify)。虽然市场份额较小,但绝对值得一提。例如 Stackify 的 Prefix 是优秀的轻量级分析工具,不仅适用于 Java,也支持其他 Web 应用。

8. 总结

本文探讨了性能分析和 Java Profiler。我们分析了每个工具的特性,以及选择它们的考量因素。

市面上有许多 Java Profiler,各具特色。选择哪个工具主要取决于:

  • 开发者的工具链偏好
  • 分析深度需求
  • Profiler 的功能特性

简单粗暴的选择建议

  • 需要全功能商业工具 → JProfiler/YourKit
  • 免费开源需求 → Java VisualVM
  • IDE 深度集成 → IntelliJ Profiler
  • 轻量级开发 → NetBeans Profiler

⚠️ 踩坑提示:远程分析时注意网络配置和权限问题,避免因连接失败浪费时间。


原始标题:A Guide to Java Profilers