1. 概述
有时候代码能跑通还不够。 我们可能需要了解内部运行机制,比如内存分配情况、不同编码方式的性能差异、并发执行的影响、性能优化点等。这时就需要性能分析工具(Profiler)。
Java Profiler 是一种在 JVM 层面监控 Java 字节码构造和操作的工具。这些构造和操作包括对象创建、迭代执行(含递归调用)、方法执行、线程状态和垃圾回收。
本文将探讨主流的 Java Profiler:JProfiler、YourKit、Java VisualVM、Netbeans Profiler 和 IntelliJ Profiler。
2. JProfiler
JProfiler 是许多开发者的首选。凭借直观的界面,它提供了系统性能、内存使用、潜在内存泄漏和线程分析的可视化视图。
通过这些信息,我们能快速定位需要优化、消除或修改的系统底层问题。
该工具需要购买许可证,但提供免费试用。
以下是 JProfiler 的界面:
JProfiler 功能概览界面
与大多数 Profiler 类似,它支持本地和远程应用分析。这意味着可以分析远程机器上的 Java 应用而无需安装任何客户端。
JProfiler 还提供SQL 和 NoSQL 数据库的高级分析功能,专门支持 JDBC、JPA/Hibernate、MongoDB、Cassandra 和 HBase。
下图展示了 JDBC 分析界面,包含当前连接列表:
JProfiler 数据库分析视图
当我们需要查看数据库调用的调用树或发现可能泄漏的连接时,JProfiler 能轻松搞定。
Live Memory 是 JProfiler 的核心功能,允许我们实时查看应用的内存使用情况。可以按对象声明、实例或完整调用树查看内存使用。
对于分配调用树,可选择查看存活对象、已回收对象或两者的调用树。还能指定分析特定类/包或所有类的分配树。
下图展示了所有对象的实时内存使用情况(含实例计数):
JProfiler 实时内存视图
JProfiler 支持与主流 IDE 集成(如 Eclipse、NetBeans 和 IntelliJ),甚至支持从快照直接跳转到源代码。
3. YourKit
YourKit Java Profiler 支持多平台,为每个操作系统(Windows、macOS、Linux、Solaris、FreeBSD 等)提供独立安装包。
与 JProfiler 类似,YourKit 的核心功能包括线程可视化、垃圾回收分析、内存使用和内存泄漏检测,并支持通过 SSH 隧道进行本地和远程分析。
YourKit 提供商业付费许可证(含免费试用),非商业用途则提供低价或免费许可。
以下是 Tomcat 应用的内存分析结果:
YourKit 分析 Tomcat 应用的内存使用情况
当需要分析抛出的异常时,YourKit 也很有用。它能快速统计异常类型和发生次数。
YourKit 的CPU 分析功能支持聚焦代码特定区域(如方法或线程子树),通过其"假设分析"(what-if)功能实现条件分析,非常强大。
YourKit 同样支持SQL 和 NoSQL 数据库调用分析,甚至能展示实际执行的查询语句。
虽然不是技术考量,但其宽松的许可模式使其成为多用户/分布式团队或单许可购买的理想选择。
4. Java VisualVM
Java VisualVM 是一个简化但强大的 Java 应用分析工具,属于免费开源工具。
该工具曾随 JDK 一起发布(JDK 8 及之前),但从 JDK 9 开始被移除,现在作为独立工具分发:VisualVM 下载。
其运行依赖 JDK 中的其他工具(如 JConsole、jstat、jstack、jinfo 和 jmap)。
下图展示了 Java VisualVM 的分析会话概览:
Java VisualVM 分析本地 Tomcat 应用
Java VisualVM 的一个显著优势是可通过插件扩展新功能,并能将插件添加到内置的更新中心。
它支持本地和远程分析(含内存和 CPU 分析),但远程连接需提供凭证(主机/IP 和密码),不支持 SSH 隧道。可启用实时分析(通常每 2 秒更新一次)。
下图展示了 Java 应用的内存分析结果:
Java VisualVM 内存堆直方图
通过快照功能,可保存分析会话快照供后续分析。
5. NetBeans Profiler
NetBeans Profiler 随 Oracle 开源的 NetBeans IDE 一起发布。
虽然它与 Java VisualVM 功能高度相似,但当需要将所有工具集成在一个程序中(IDE + Profiler)时,它是理想选择。前述其他 Profiler 均通过插件增强 IDE 集成。
下图展示了 NetBeans Profiler 的界面:
NetBeans Profiler 遥测界面
NetBeans Profiler 也是轻量级开发和分析的不错选择。它提供单一窗口配置和控制分析会话,并展示结果。其独特功能是能统计垃圾回收发生频率。
6. IntelliJ Profiler
IntelliJ Profiler 是一个简单但强大的 CPU 和内存分配分析工具,结合了两大流行 Java Profiler 的能力:JFR 和 Async Profiler。
尽管有高级功能,但核心目标是易用性。IntelliJ Profiler 无需任何配置,点击几下即可启动,同时提供日常开发所需的实用功能。
作为 IntelliJ IDEA Ultimate 的一部分,IntelliJ Profiler 可一键附加到进程,并能像操作源代码一样在快照和代码间导航。其差分火焰图等功能,可快速高效地可视化评估不同方案的性能:
IntelliJ Profiler 支持 Windows、Linux 和 macOS。
7. 其他优秀 Profiler
值得关注的工具还有 Java Mission Control、New Relic 和 Prefix(来自 Stackify)。虽然市场份额较小,但绝对值得一提。例如 Stackify 的 Prefix 是优秀的轻量级分析工具,不仅适用于 Java,也支持其他 Web 应用。
8. 总结
本文探讨了性能分析和 Java Profiler。我们分析了每个工具的特性,以及选择它们的考量因素。
市面上有许多 Java Profiler,各具特色。选择哪个工具主要取决于:
- 开发者的工具链偏好
- 分析深度需求
- Profiler 的功能特性
✅ 简单粗暴的选择建议:
- 需要全功能商业工具 → JProfiler/YourKit
- 免费开源需求 → Java VisualVM
- IDE 深度集成 → IntelliJ Profiler
- 轻量级开发 → NetBeans Profiler
⚠️ 踩坑提示:远程分析时注意网络配置和权限问题,避免因连接失败浪费时间。