
什么是 Java 分析器?
Java 分析器是一种用于测量和检查 Java 应用程序性能的工具。它收集程序执行的数据,包括每个函数所花费的时间、内存使用情况以及函数调用的频率。
Java Profiling 有利于查明软件应用程序中的性能瓶颈。通过分析探查器收集的数据,开发人员可以识别出导致延迟或资源消耗的代码部分。这些数据可以增强代码、提高性能并减少资源消耗。
因此,Java 分析器是一种在 JVM 级别检查 Java 字节码构造和操作的工具。这些编程结构和动作包括创建对象、重复进程(包括递归调用函数)、执行方法、运行线程和执行垃圾收集。
Java 分析器的类型
- 采样分析器:这些分析器定期拍摄正在运行的程序的快照并分析调用堆栈以识别热点。
- 仪器分析器:这些分析器修改程序的代码以收集更详细的性能数据。
Java 分析器的使用场景
Java Profiling 工具基本上可以通过三种方式使用:
性能优化:开发人员可以利用 Java 分析器来查明导致性能问题的代码部分,例如缓慢的函数调用或高内存使用率。这些数据可用于增强代码以获得更好的性能。
内存管理:Java 分析器可以帮助检测内存泄漏,即程序无法释放未使用的内存。这些泄漏可能会导致内存不足,从而导致程序崩溃。通过查明内存泄漏,开发人员可以更正代码以释放不再需要的内存。
测试:Java 分析器可以评估各种场景下的程序性能,例如不同的输入大小或用户数量。这可以帮助在程序启动之前识别可能的性能问题。
Java 分析器如何工作?
JVM 允许开发人员将代理附加到正在运行的 JVM(Java 虚拟机)中。当开发人员将代理附加到 JVM 时,JVM 将在加载代理之前向代理提供一个类。然后代理会转换类。代理可以更改任何类的代码。
Java 分析器基本上是代理。他们将检测代码添加到方法的开头和结尾,以跟踪它们需要多长时间。他们还将代码添加到每个类的构造函数和终结方法中,以跟踪使用了多少内存。
在 Java 中,代码分析可以通过一系列工具来实现,包括内置工具和第三方工具。一些很受欢迎的工具包括:
- JVM tools
- Digma
- VisualVM
- YourKit
- JProfiler
- NetBeans Profiler
- IntelliJ Profiler
- Async Profiler
- Arthas
1、JVM Tools
这些 Java 分析工具与标准 JDK *绑捆**在一起,不需要单独安装或设置。大约有五个:jstat、jmap、jcmp、jhat 和 hprof。
A、 jstat
这个内置命令行工具是标准 JDK 附带的,不需要安装或设置。通过命令行监控 JVM 内存、堆大小和垃圾收集活动非常有用。
该工具利用 JVM 中默认启用的内置工具,通过虚拟机标识符 (VMID) 来识别目标 Java 进程,而不需要任何特殊命令来启动 JVM。
以下是使用jstat 的三种方法:
- 使用预定义的性能约束运行 Java 程序
java -Xmx125m -Xms25m -Xmn15m -XX:PermSize=30m -XX:MaxPermSize=30m -XX:+UseSerialGC HelloWorld
使用以下命令获取进程ID
ps aux | grep java
要开始监视 JVM 堆内存使用情况,在终端上使用 -gc 选项运行 jstat。
jstat -gc 98132 17527

B、 jmap
该命令行工具也包含在标准 JDK 中,用于获取Java 进程的堆内存信息。它会输出 Java 进程的整体堆内存使用情况,包括 heap 总大小、已使用大小、空闲大小等。同时还会输出堆内存中各种对象所占用的空间大小以及数量,如类、字符数组、字符串等。这对于检查基本配置和算法特别有用。需要注意的是从 JDK 8 开始建议使用jcmd,而不是 jmap,因为可以改进诊断并降低性能影响。
以下是如何在终端上使用 jmap
jmap --heap <JAVA_PID>
还可以使用此命令创建堆转储
jmap — -dump:file=<FILE> <JAVA_PID>
C、 jcmp
该命令行工具随标准 JDK 一起提供,不需要任何安装或设置。它用于向 JVM 发送诊断命令指令。
可以使用此命令创建堆转储。
jcmd <JAVA_PID> GC.heap_dump filename=<FILE>
D、jhat
该命令行工具随标准 JDK 一起提供,不需要任何安装或设置。它用于分析堆快照(也称为堆转储)中对象的结构。
该工具是堆分析工具 (HAT) 的替代品。它处理二进制格式的堆转储,例如由 jcmd 生成的堆转储。
该工具还可以帮助识别意外的对象连接(类似于 Java 中的内存泄漏)
E、hprof
这个内置命令行工具随标准 JDK 一起提供。它通过分析堆和 CPU性能分析、锁争用、内存泄漏和其他问题来检查性能。它是一个动态链接库 (DLL),通过 Java 虚拟机接口 (JVMTI) 与 JVM 进行通信。
它以 ASCII 或二进制形式记录文件或套接字的分析数据。它可以提供有关堆分配统计信息、堆转储、CPU 使用情况、JVM 中所有监视器和线程的状态以及争用配置文件的信息。
使用以下命令,使用 hprof 获取堆分配配置文件。
javac –J-agentlib:hprof=heap=sites HelloWorld.java
使用下面的命令,创建堆转储。
javac –J-agentlib:hprof=heap=dump HelloWorld.java
2、Digma
Digma 依赖于使用 OTEL 自动收集的可观测性数据。与其他分析工具一样,目的是分析代码在运行时的工作情况并发现问题;唯一的区别是 Digma 会不断地自行找到它们。
让我们看几个例子:
- 查找哪些代码/查询对应用程序的影响最大(性能影响)。
A、我们可以在“Assets”选项卡中找到对性能影响最大的代码,并按性能影响进行排序:

此视图对开发人员很实用,它可以快速显示哪些端点可能因性能问题而需要优化。执行时间和性能影响相结合,可以优先进行故障排除和开发重点,有助于提高应用程序的整体性能和可靠性。
B、显示最近性能变化的持续时间

3、VisualVM
在 JDK 8 之前,该工具一直是 Java 开发工具包 (JDK) 的一部分,但在 JDK 9 中被删除,目前作为单独的工具提供。
该分析器可方便地进行 CPU 采样、内存采样、运行垃圾收集、分析堆错误、拍摄快照以及使用图形用户界面。
此 外它还支持本地和远程分析,但不支持通过 SSH 隧道进行分析;需要配置 JMX 端口以进行远程分析。
VisualVM 可以拍摄分析会话的快照进行分析。
VisualVM 依赖于 JDK 附带的其他独立工具,例如 JConsole、jstat、jinfo、jstack 和 jmap。

4、Yourkit
YourKit Java Profiler 与各种平台兼容,为不同的操作系统都提供不同的安装文件,例如 Windows、MacOS、Linux、Solaris 和 FreeBSD。
与 JProfiler 一样,YourKit 还包含显示线程、垃圾收集、内存使用情况和内存泄漏的基本功能。它支持通过 SSH 隧道进行本地和远程分析。

YourKit 提供用于商业目的的付费许可证,包括免费试用以及供个人使用的折扣或免费许可证。
YourKit 特点在于提供了独特的 CPU 分析功能,该功能专注于代码的特定部分,例如线程内的方法或分支。此功能非常有用,因为它可以通过其假设功能进行条件分析。
5、JProfiler
JProfiler 提供了用于监视内存使用情况、系统性能、潜在内存泄漏以及具有友好用户界面的线程分析的接口。有了这些信息,我们就可以轻松识别系统基础中的优化、删除或修改区域。

Java Profiler 需要付费购买。主要重点是解决四个关键领域:
- 方法调用:分析方法调用可以深入了解应用程序的功能,并有助于提高其整体性能。
- 分配:通过检查存储在堆中的项目、引用连接和管理废物收集,此功能可以解决内存泄漏并提高内存效率。
- 线程和锁:JProfiler 提供有关线程和锁的各种分析视角,可以帮助我们识别多线程问题。
- 高级子系统:许多性能问题出现在更高的语义级别。例如对于 Java 数据库连接中的 JDBC 调用,识别最慢的 SQL 语句至关重要。 JProfiler可以对这些子系统进行综合检查。
JProfiler 可以与 IntelliJ IDEA、Eclipse 和 NetBeans 等IDE 集成。并且还支持从快照跳转到实际的源代码。
6、NetBeans Profiler
NetBeans结合分析器和调试器的功能可以监视代码执行时间和运行时行为,并提高了多线程等调试方法的效率。 Netbeans 分析器提高了应用程序的速度,从而提高了内存效率。

7、 IntelliJ Profiler
IntelliJ Profiler 是一个简单但强大的工具,用于分析 CPU 和内存分配。它合并了两个著名的 Java 分析器的功能:JFR 和Async Profiler。
尽管有一些高级功能可用,但主要重点是简单性。 IntelliJ Profiler 提供了一种无需设置即可开始的简单方法,并为我们的日常开发任务提供了有价值的工具。

在 IntelliJ IDEA 中,IntelliJ Profiler 可以轻松连接到 Java 进程,并且支持快照和源代码之间的跳转。在其他方面,例如火焰图,可以使我们能够直观地分析各种方法的有效性,并快速有效地了解运行时过程。
8、 Async Profiler
该 Java 分析工具的开销最小,并且避免了安全点偏差问题。它包括特定于 HotSpot 的 API,用于收集堆栈跟踪和监视内存分配。该探查器与 OpenJDK 和其他利用 HotSpot JVM 的 Java 运行时兼容。
Async Pprofiler 能够监视各种类型的事件。
- CPU周期
- 性能计数器(例如缓存未命中、分支未命中、页面错误和上下文切换)监视硬件和软件性能。
- Java堆中的内存分配
- 满足的锁定尝试,包括Java对象监视器和可重入锁。

9、 Arthas
Arthas 的一个主要优点是无需修改代码或重新启动正在监视的 Java 服务。

其他 Java 分析器
除了以上这些比较流行的分析工具外,还有一些小众的分析工具,比如Java Mission Control、New Relic、Glowroot、JMH、Arthas、XRebel/JRebel、JProbe、Pinpoint 和 Stackify Prefix等。
结论
每个分析工具都有各自的一些优点,通过了解他们各自的优势,可以让我们在实际工作过程中,选择合适的工具来帮助我们快速找出问题所在,通过多个工具结合使用来获得最佳优化结果。比如Grafana 用于应用程序日志的可视化,YourKit 用于分析应用程序的潜在瓶颈,而 Digma 则提供对潜在问题代码片段的分析。
好了,今天的内容就分享到这里。若这篇文章能给您带来些许帮助或启发,请不吝关注我的头条号,并给予点赞、留言和转发。您的每一次支持,都是我继续创作的最大动力!感谢您的陪伴,期待与您共同成长。