9个最适合使用的Java分析器

Java分析器工具可以明显的提高问题定位、分析、处理的效率,下面会给大家简单的介绍几款日常工作过程中使用到的Java分析器。

0.什么是 Java 分析器?

Java 分析器是一种用于测量和检查 Java 应用程序性能的工具。它收集程序执行数据,包括每个函数所用的时间、内存使用情况和函数调用频率。

Java 分析有助于查明软件应用程序中的性能瓶颈。分析分析器收集的数据可让开发人员确定导致最明显延迟或资源消耗的代码部分。这些数据可以增强代码、提高性能并减少资源消耗。

因此,Java 分析器是一种在 JVM 级别检查 Java 字节码构造和操作的工具。这些编程结构和操作包括创建对象、重复进程(包括递归调用函数)、执行方法、运行线程和执行垃圾收集。

1.Java 分析器的分类

  • 采样分析器:这些分析器定期对正在运行的程序进行快照,并分析调用堆栈以识别热点。
  • 仪表分析器:这些分析器修改程序的代码以收集更详细的性能数据。

2.Java 分析器的使用场景

Java 分析工具基本上有三种使用方式:

  • 性能优化:开发人员可以利用 Java 分析器来精确定位导致性能问题的代码部分,例如函数调用缓慢或内存使用率过高。可以利用这些数据来增强代码以获得更好的性能。

  • 内存管理:Java 分析器可以帮助检测内存泄漏,即程序无法释放未使用的内存。这些泄漏可能导致内存不足,从而导致程序崩溃。通过精确定位内存泄漏,开发人员可以纠正代码以释放不再需要的内存。

  • 测试:Java 分析器可以评估各种场景下的程序性能,例如不同的输入大小或用户数量。这有助于在程序启动之前识别可能的性能问题。

3.Java 分析器如何工作?

JVM 允许 Java 开发人员将代理附加到正在运行的 JVM(Java 虚拟机)。当开发人员将代理附加到 JVM 时,JVM 将在加载类之前向代理提供一个类。然后,代理将转换该类。代理可以更改任何类的代码。

Java 分析器基本上是代理。它们在方法的开头和结尾添加检测代码,以跟踪它们花费的时间。它们还向每个类的构造函数和 finalize 方法添加代码,以跟踪使用了多少内存。

在 Java 中,可以通过一系列工具实现代码分析,包括内置工具和第三方工具。
一些广受欢迎的工具包括:

  • JVM 工具
  • Digma
  • VisualVM
  • YourKit
  • JProfiler
  • NetBeans Profiler
  • IntelliJ Profiler
  • Async Profiler
  • Arthas

OpenTelemetry 和 Java Flight Recorder (JFR) 涵盖了大多数基础。如果您想要自动检测,请使用 OpenTelemetry Java 代理;如果您想要进行自己的检测,则只需使用 API。

4.Java分析工具

4.1. JVM 工具

这些 Java 分析工具与标准 JDK 捆绑在一起,无需单独安装或设置。大约有五个:jstat、jmap、jcmp、jhat 和 hprof。

4.1.1. jstat

此内置命令行工具随标准 JDK 一起提供,无需安装或设置。通过命令行监控 JVM 内存、堆大小和垃圾收集活动非常有益。

此工具利用 JVM 中默认启用的内置检测功能,通过虚拟机标识符 (VMID) 识别目标 Java 进程,而无需任何特殊命令来启动 JVM。

  • 使用预定义的性能约束运行 Java 程序

java -Xmx125m -Xms25m -Xmn15m -XX:PermSize=30m -XX:MaxPermSize=30m
Demo

  • 您可以使用以下命令获取进程 ID:

ps aux | grep java

  • 要开始监控 JVM 堆内存使用情况,请在终端上使用 -gc 选项运行 jstat。

jstat -gc < vmid > < lines >

4.1.2. jmap

此命令行工具也包含在标准 JDK 中。它显示实时 VM 或核心文件的内存相关数据(堆摘要、java 对象堆直方图、类加载器统计信息、最终化队列信息、以 hprof 二进制格式转储 Java 堆)。检查基本配置和算法特别有益。

我建议使用 JDK 8 中提供的较新的实用程序 jcmd,而不是 jmap 实用程序,以改进诊断并降低性能影响。

以下是如何在终端上使用 jmap

jhsdb jmap –-heap <JAVA_PID>

您还可以使用此命令创建堆转储

jcmd <JAVA_PID> GC.heap_dump filename=

4.1.3. jhat

此命令行工具随标准 JDK 预装(无需安装/设置)。它用于探索堆快照(也称为堆转储)中对象的结构。

此工具是堆分析工具 (HAT) 的替代品。它处理二进制格式的堆转储,例如由 jcmd 生成的转储。

此工具还可以帮助识别意外的对象连接(类似于 Java 中的内存泄漏 - 由于从根集引用而仍在使用的对象)

4.1.4. hprof

此内置命令行工具随标准 JDK 一起提供。它通过分析堆和 CPU 分析、锁争用、内存泄漏和其他问题来检查性能。它是一个通过 Java 虚拟机工具接口 (JVMTI) 与 JVM 通信的动态链接库 (DLL)。它以 ASCII 或二进制形式记录文件或套接字的分析数据。它可以提供有关堆分配统计信息、堆转储、CPU 使用率、JVM 中所有监视器和线程的状态以及争用配置文件的信息。

您可以使用以下命令使用 hprof 对类进行分析。

java –agentlib:hprof HelloWorld

使用以下命令,您可以使用 hprof 获取堆分配配置文件。

javac –J-agentlib:hprof=heap=dump HelloWorld.java

4.2.Digma持续反馈

Digma 依赖于使用 OTEL 自动收集的可观察性数据。与其他分析工具一样,其目的是分析代码在运行时的工作方式并发现问题;唯一的区别是 Digma 会自行持续发现问题。

让我们看几个例子:

  • 查找哪些代码/查询对应用程序的损害最大(性能影响)

您可以在 Assets 选项卡中找到对性能影响最大的代码,并按性能影响对它们进行排序。
此视图对开发人员来说非常有价值,因为它可以快速概览哪些端点可能由于性能问题而需要优化。执行时间和性能影响的结合可以实现优先故障排除和开发重点,从而帮助提高应用程序的整体性能和可靠性。

打开仪表板并使用客户端跨度性能影响小部件:
此小部件可帮助开发人员快速识别其应用程序中的哪一部分可能导致性能问题。他们可以优先考虑调试和优化工作,从标记为对性能影响较大的端点开始。

  • 识别最近提交中的性能下降(持续时间变化)

跟踪代码性能最近变化的另一种方法是持续时间洞察。它以可视化方式呈现特定跨度的调用持续时间分布。

上次调用性能:小部件显示最近调用的持续时间(91.95 毫秒),可以立即将其与典型性能进行比较,以确定其是否在预期范围内或异常值。

中位持续时间:中位持续时间最近已更改(16.19 毫秒)。红色表示最近发生了变化,这可能表明性能下降或提高。

性能分布:直方图本身显示调用持续时间的频率,使开发人员可以快速查看各种性能时间的共性。它显示了某些范围的调用持续时间发生的频率。

最慢的 5%:直方图中代表最慢的 5% 调用的部分会突出显示。这对于识别可能从平均或中位数统计数据中不明显的长尾性能问题至关重要。

使用此洞察,开发人员可以跟踪代码随时间的性能。可视化有助于识别趋势,例如延迟增加,这可能表示潜在问题,例如内存泄漏、低效的数据库查询或其他资源争用问题。表示最近更改的红色块特别有用,因为它可以将性能变化与最近的代码更改或部署更新关联起来,从而促使更立即的调查。

  • 通过分析发现扩展问题(扩展洞察)
    Digma 提供对代码可扩展性的洞察,识别可能阻碍应用程序扩展能力的潜在问题。

例如,借助 Scaling 问题洞察,开发人员可以快速发现与并发处理和请求处理时间相关的性能瓶颈。

性能下降指标有助于确定性能下降的负载级别。此指标可以指导开发人员检查这些事务期间执行的代码路径,以发现效率低下或资源争用。

并发信息通知开发人员系统在处理并发进程或线程时遇到问题。这可能表明应用程序处理并行处理的方式存在问题,或者为应用程序分配的资源不足,无法在此并发级别上实现最佳性能。

时间持续时间:广泛的范围表明响应时间在某些情况下可能会显著增加,这可能是由于处理瓶颈、算法效率低下、数据库查询性能或其他系统限制造成的。

通过综合这些信息,开发人员可以了解应用程序需要注意的方面,并可以开始形成关于可能导致问题的假设,例如代码效率低下、数据库瓶颈、硬件资源不足或架构决策不理想。目标是调查和解决这些领域以提高应用程序的可扩展性。

4.3.VisualVM

此工具在 JDK 8 之前一直是 Java 开发工具包 (JDK) 的一部分,但在 JDK 9 中被删除,目前作为单独的工具提供。

此 Java 分析器可方便地用于 CPU 采样、内存采样、运行垃圾收集、分析堆错误、拍摄快照以及使用图形用户界面。

此 Java 分析器支持本地和远程分析,但不支持通过 SSH 隧道进行分析;您需要配置 JMX 端口以进行远程分析。

VisualVM 允许拍摄分析会话的快照以供以后分析。

VisualVM 依赖于 JDK 附带的其他独立工具,例如 JConsole、jstat、jinfo、jstack 和 jmap。

以下是使用 VisualVM 的三种方式:

  • 使用预定义的性能约束运行 Java 程序

  • java -Xmx125m -Xms25m -Xmn15m -XX:PermSize=30m -XX:MaxPermSize=30m Demo
    在终端上运行 jvisualvm 并开始监控 JVM 堆内存使用情况

  • jvisualvm
    接下来,Java VisualVM 程序将启动。导航至“工具”>“插件”并下载 Visual GC 插件(还将显示其他插件的选择。您可以根据需要使用它们。)。

4.4.YourKit

YourKit Java Profiler 与各种平台兼容,并为每个支持的操作系统(如 Windows、MacOS、Linux、Solaris 和 FreeBSD)提供不同的安装。

与 JProfiler 一样,YourKit 还包括显示线程、垃圾收集、内存使用情况和内存泄漏的基本功能。它支持通过 SSH 隧道进行本地和远程分析。

YourKit 提供商业用途的付费许可证,包括免费试用版和个人用途的折扣或免费许可证。

YourKit 还有助于分析抛出的异常。识别抛出的异常及其频率非常简单。

YourKit 提供了独特的 CPU 分析功能,专注于代码的特定部分,例如方法或线程内的分支。此功能非常有用,因为它允许通过其假设功能进行条件分析。

YourKit 还允许分析 SQL 和 NoSQL 数据库调用。

4.5.JProfiler

JProfiler 是由 ej-technologies 创建的 Java 应用程序分析工具。JProfiler 提供了用于监控内存使用情况、系统性能、潜在内存泄漏和线程分析的接口,并且用户界面友好。

有了这些信息,我们可以轻松识别系统基础中的优化、删除或修改区域。

JProfiler 是由 ej-technologies 创建的 Java 应用程序分析工具。JProfiler 提供了用于监控内存使用情况、系统性能、潜在内存泄漏和线程分析的接口,并且用户界面友好。

有了这些信息,我们可以轻松识别系统基础中的优化、删除或修改区域。

此 Java Profiler 需要购买许可证,但提供免费试用。主要重点是解决四个关键领域:

方法调用:分析方法调用可以深入了解应用程序的功能并帮助提高其整体性能。

分配:通过检查存储在堆中的项目、引用连接和管理废物收集,此功能允许您解决内存泄漏并提高内存效率。

线程和锁:JProfiler 提供线程和锁的各种分析视角,以帮助您识别多线程问题。

高级子系统:许多性能问题出现在更高的语义级别。对于 Java 数据库连接中的 JDBC 调用,识别最慢的 SQL 语句至关重要。JProfiler 允许对这些子系统进行综合检查。

JProfiler 可以与 IntelliJ IDEA、Eclipse 和 NetBeans 等知名 IDE 集成。甚至可以从快照转到实际源代码。

4.6.NetBeans Profiler

尽管 NetBeans 主要因其出色的调试功能而受到认可,但它也出人意料地成为顶级 Java 分析器之一。Apache NetBeans IDE 将 NetBeans Profiler 作为其软件包的一部分。它也是轻松开发和分析的绝佳选择。

结合分析器和调试器的功能,可以监控代码执行时间和运行时行为,并提高多线程等调试方法的效率。Netbeans 分析器可提高应用程序的速度,从而提高内存效率。您可以从他们的网站免费下载它,这真是太好了。

虽然 Java VisualVM 和 Netbeans Profiler 的功能相似,而且都是免费的,但 Netbeans 脱颖而出,在一个带有 IDE 的捆绑程序中提供所有功能。

4.7.IntelliJ Profiler

IntelliJ Profiler 是一款简单但功能强大的工具,用于分析 CPU 和内存分配。它融合了两个著名的 Java 分析器的功能:JFR 和 Async 分析器。

虽然有一些高级功能可用,但主要重点是简单性。IntelliJ Profiler 提供了一种无需设置的简单入门方法,并为我们的日常开发任务提供了有价值的工具。

在 IntelliJ IDEA Ultimate 中,IntelliJ Profiler 可以轻松连接到 Java 进程,从而实现快照与源代码之间的无缝导航。其他方面,例如清晰的火焰图,使我们能够直观地评估各种方法的有效性,并及时有效地了解运行时进程。

4.8.Async Profiler

此 Java 分析工具开销极小,可避免 Safepoint 偏差问题。它包含特定于 HotSpot 的 API,用于收集堆栈跟踪和监控内存分配。分析器与 OpenJDK 和其他使用 HotSpot JVM 的 Java 运行时兼容。

async-profiler 能够监控各种类型的事件。

  • 中央处理单元操作
  • 性能计数器(如缓存未命中、分支未命中、页面错误和上下文切换)监控硬件和软件性能。
  • Java 堆中的内存分布

内容锁定试验,包括 Java 对象监视器和 ReentrantLocks 的内容锁定试验。
在撰写本文时,Async Profiler 仅支持 Linux 和 Mac 操作系统。如果您使用 IntelliJ IDEA,则无需安装任何其他程序。集成是预安装的,包括:

  • 启动和终止分析会话
  • 连接到已在进行的进程
  • 检查配置文件评估。

4.9.Arthas

阿里巴巴 Arthas 是一款诊断 Java 应用程序的工具,提供跟踪、分析和解决问题的功能。使用 Arthas 的一个主要优点是无需修改代码或重新启动受监控的 Java 服务。

如果您在生产中遇到问题,则无法使用 IDE 远程调试应用程序。此外,在生产环境中进行调试是一种不好的做法,因为它会暂停所有线程,进而会暂停业务服务。

作为开发人员,您可以即时排除生产问题故障:无需额外更改代码,无需重新启动 JVM。Arthas 将作为观察者工作,并且不会暂停您现有的线程。

使用单个命令,您可以在 Unix、Linux 和 Mac 上安装 Arthas。

curl -L https://arthas.aliyun.com/install.sh | sh

上面的命令将引导脚本 as.sh 下载到当前目录。然后,您可以将其移动到您想要的任何目录或将其位置放在 $PATH 中。

4.10.其他可靠的 Java 分析器

值得一提的是 Java Mission Control、New Relic、Glowroot、JMH、Arthas、XRebel/JRebel、JProbe、Pinpoint 和 Stackify Prefix。虽然它们占据的市场份额较小,但无疑值得认可。

5.总结

因此,我们发现将 YourKit 和 Digma 结合起来可以获得最佳优化结果:Grafana 用于可视化应用程序日志,YourKit 用于分析应用程序以发现潜在的瓶颈,而 Digma 可以无缝洞察潜在的有问题的代码片段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值