每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/
最近,我在开发一个第三方Linux应用时,开始遇到一些问题,我怀疑我的一个应用程序可能存在内存泄露,因为我不断收到内存不足的异常。
因此,我决定启动一个分析器来监控这个第三方应用程序。我的想法是将分析器附加到正在运行的Java进程上,然后使用分配调用树视图记录被调用的方法及其关联的类。
当我开始寻找可以帮助我的Java分析器时,我意识到有很多这样的工具,所以我决定尝试YourKit。它是一个受欢迎且健壮的Java分析器,专为Java应用程序设计。设置分析器相当简单,与我听到的谣言相反。
我启动了分析器,发现它具有很好的潜力,但实际上要确定问题所在非常困难,需要很长时间。一旦我得到了数据,分析起来很难,因为我需要实际查看调用树并手动得出结论。
我记得我最近偶然发现了一个很酷的工具,在读了一篇关于优化SQL查询的文章后,我打算尝试它。这个工具并不是传统意义上的分析器,但它可以辅助我的分析工作,因为它可以分析可观测性数据。我认为Digma的持续反馈工具可以帮助我分析分析器的结果,更快地得出结论,并帮助我知道在分析器中寻找什么。因此,我同时打开了Digma和YourKit分析器。
在这篇博客中,我将分享我为什么决定启动一个分析器,我发现的适合分析Java应用的分析器列表,以及Digma持续反馈如何帮助分析分析器的数据并得出结论。
什么是Java分析器?
Java分析器是一种工具,用于衡量和检查Java应用程序的性能。它收集程序执行的数据,包括每个函数所需的时间、内存使用情况和函数调用频率。
Java分析对于确定软件应用中的性能瓶颈非常有益。分析分析器收集的数据可以帮助开发者识别代码中负责最显著延迟或资源消耗的部分。这些数据可以改善代码,提升性能,并减少资源消耗。
因此,Java分析器是一种检查Java字节码结构和操作的工具,这些编程结构和操作包括创建对象、重复过程(包括递归调用函数)、执行方法、运行线程和进行垃圾收集。
Java分析器的类型
- 采样分析器:这些分析器定期对运行中的程序进行快照,并分析调用堆栈以识别热点。
- 仪器分析器:这些分析器修改程序的代码以收集更详细的性能数据。
Java分析器的使用场景
基本上,Java分析工具可以以三种方式使用:
性能优化:开发者可以使用Java分析器来确定代码中负责性能问题的部分,如慢函数调用或高内存使用。这些数据可以用来改进代码以获得更好的性能。
内存管理:Java分析器可以帮助检测内存泄露,即程序未能释放未使用的内存。这些泄露可能导致内存不足,从而导致程序崩溃。通过确定内存泄露,开发
者可以更正代码以释放不再需要的内存。
测试:Java分析器可以评估程序在不同场景下的性能,如输入大小或用户数量的变化。这可以帮助在程序发布前识别潜在的性能问题。
Java分析器如何工作?
JVM允许Java开发者将一个代理附加到正在运行的JVM(Java虚拟机)上。当开发者将一个代理附加到JVM时,JVM将在加载它之前提供一个类给代理。然后代理转换这个类。代理可以更改任何类的代码。
Java分析器基本上是代理。它们在方法的开始和结束处添加仪器代码,以跟踪它们花费了多长时间。它们还在每个类的构造器和finalize方法中添加代码,以跟踪使用了多少内存。
在Java中,代码分析可以通过一系列工具实现,包括内置工具和第三方工具。一些受欢迎的工具包括:
- - JVM工具
- - Digma
- - VisualVM
- - YourKit
- - JProfiler
- - NetBeans分析器
- - IntelliJ分析器
- - Async分析器
- - Arthas
- - OpenTelemetry和Java Flight Recorder(JFR)涵盖了大多数基础。如果你想要自动化仪器,使用OpenTelemetry Java代理,或者如果你想进行自己的仪器,就使用API。
每种工具都有其特点和适用场景,从简单的命令行工具到复杂的图形界面应用,开发者可以根据自己的需要选择合适的分析器。例如,Digma的持续反馈工具通过自动收集可观察性数据,持续地找到代码中的问题,与传统的分析器相比,它提供了一种更动态和自动化的方式来分析和优化Java应用。
结论是,通过结合使用YourKit和Digma,以及利用Grafana进行应用日志的可视化,可以实现最佳的优化效果:YourKit用于分析应用潜在的瓶颈,Digma提供对问题代码片段的无缝洞察。
FAQ部分指出,JProfiler是一个为Java应用设计的强大的高级Java分析器,提供了10天的完整试用版。
Java内存分析器专门检查Java应用如何使用内存,以确定性能问题并修复内存泄露。
Java的CPU分析是一种通过检查CPU利用率来评估和提高应用效率的方法,它帮助识别热点、瓶颈和代码中可能导致CPU使用率增加或性能不佳的低效率。
全部整体翻译成中文:
1. JVM 工具
这些 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 中。它显示了一个活动 VM 或核心文件的内存相关数据(堆摘要、Java 对象堆直方图、类加载器统计、终结队列信息、以 hprof 二进制格式转储的 Java 堆)。
特别有益于检查基本配置和算法。
我建议使用自 JDK 8 起可用的较新工具 jcmd,而不是 jmap 工具,以获得改进的诊断和减少的性能影响。
以下是如何在终端上使用 jmap
jhsdb jmap —heap <JAVA_PID>
你也可以使用这个命令创建堆转储
jhsdb jmap —dump:file=<FILE> <JAVA_PID>
c. jcmp
这个命令行工具随标准 JDK 一起提供,不需要任何安装或设置过程。它用于向 JVM 发送诊断命令指令。
你可以使用这个命令创建堆转储。
jcmd <JAVA_PID> GC.heap_dump filename=<FILE>
d. jhat
这个命令行工具预装于标准 JDK(无需安装/设置)。它用于探索堆快照(也称为堆转储)中对象的结构。
这个工具是 Heap Analysis Tool(HAT)的替代品。它处理以二进制格式的堆转储,例如由 jcmd 生成的。
这个工具还可以帮助识别意外的对象连接(类似于 Java 中的内存泄漏——因为它从 rootset 中被引用而仍在使用的对象)
e. hprof
这个内置命令行工具随标准 JDK 提供。通过分析堆和 CPU 分析、锁竞争、内存泄漏和其他问题来检查性能。它是一个动态链接库(DLL),通过 Java 虚拟机工具接口(JVMTI)与 JVM 通信。
它以 ASCII 或二进制形式记录文件或套接字的分析数据。它可以提供有关堆分配统计、堆转储、CPU 使用情况、JVM 中所有监视器和线程的状态以及争用配置文件的信息。
java –agentlib:hprof HelloWorld
使用以下命令,你可以使用 hprof 获取堆分配概况。
javac –J-agentlib:hprof=heap=sites HelloWorld.java
使用以下命令,你可以创建堆转储。
javac –J-agentlib:hprof=heap=dump HelloWorld.java
2. Digma 持续反馈
Digma 依赖于它使用 OTEL 自动收集的可观察性数据。像其他分析工具一样,其目的是分析代码在运行时的工作方式并找出问题;唯一的区别是 Digma 会自动不断地发现它们。
让我们看几个例子:
找出对应用程序影响最大的代码/查询(性能影响)。
a. 你可以在资产标签中找到性能影响最大的代码并按性能影响排序:
数据库查询洞察
性能影响
这种视图对开发者很有价值,因为它提供了哪些端点可能需要因性能问题进行优化的快速概览。执行时间和性能影响的结合允许优先解决故障排除和开发重点,帮助提高应用程序的整体性能和可靠性。
b. 或者打开仪表板并使用客户端跨度性能影响小部件:
Digma 仪表板:性能影响
这个小部件帮助开发者快速识别他们的应用程序中哪些部分可能在导致性能问题。他们可以优先调试和优化工作,从标记有高性能影响的端点开始。
2. 在最近的提交中识别性能下降——持续时间变化
持续时间变化
另一种跟踪代码性能最近变化的方式是持续时间洞察。它提供了对特定跨度调用持续时间分布的视觉表示。
最后一次调用性能:小部件显示最近一次调用的持续时间(91.95 毫秒),这可以立即与典型性能进行比较,以确定它是否在预期范围内或是一个异常值。
中位持续时间:中位
持续时间最近发生了变化(增加了 16.19 毫秒)。红色表示最近的变化,这可能表明性能下降或提高。
性能分布:直方图本身显示了调用持续时间的频率,让开发者能快速看到各种性能时间的普遍性。它展示了特定持续时间范围发生的频率。
最慢的 5%:代表调用最慢的 5% 的直方图部分被突出显示。这对于识别可能从平均或中位数统计中不明显的长尾性能问题至关重要。
使用这一洞察力,开发者可以随时间跟踪代码的性能。该可视化有助于识别趋势,如延迟增加,这可能表示潜在问题,如内存泄露、数据库查询效率低下或其他资源争用问题。红色块表示的最近变化特别有用,因为它可以将性能变化与最近的代码更改或部署更新相关联,促使更即时的调查。
3. 分析寻找扩展问题——扩展洞察力
Digma 提供了代码可扩展性的洞察力,识别可能阻碍应用程序扩展能力的潜在问题。
例如,通过扩展问题洞察力,开发者可以快速发现与并发处理和请求处理时间相关的性能瓶颈。
性能下降指标有助于识别性能下降的负载水平。这个指标可以引导开发者检查在这些事务期间执行的代码路径,以找出效率低下或资源争用
并发信息通知开发者,系统在处理并发过程或线程时遇到问题。这可能表明应用程序在处理并行处理方面存在问题,或者为应用程序在此级别的并发性能优化分配的资源不足。
时间持续:广泛的范围表明,在某些条件下,响应时间可能显著增加,这可能是由于处理瓶颈、算法效率低下、数据库查询性能或其他系统限制
通过综合这些信息,开发者被引导关注应用程序需要注意的方面,并开始形成关于可能导致问题的假设,如代码效率低下、数据库瓶颈、硬件资源不足或次优的架构决策。目标是调查和解决这些领域,以提高应用程序的可扩展性。
3. VisualVM
这个工具在 JDK 9 中被移除之前,是 Java 开发套件(JDK)的一部分,目前作为一个独立工具可用。这个 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 -XX:+UseSerialGC HelloWorld
在终端上运行 jvisualvm 并开始监控 JVM 堆内存使用情况
jvisualvm
接下来,Java VisualVM 程序将启动。导航到工具 > 插件并下载 Visual GC 插件(也会显示其他插件选择。根据需要使用它们。
4. Yourkit
YourKit Java 分析器与各种平台兼容,并为每个支持的操作系统提供不同的安装,如 Windows、MacOS、Linux、Solaris 和 FreeBSD。
像 JProfiler 一样,YourKit 也包括显示线程、垃圾收集、内存使用和内存泄漏的基本功能。它支持通过 SSH 隧道进行本地和远程分析。
YourKit 提供商业用途的付费许可,包括免费试用和个人使用的折扣或免费许可。
YourKit 对分析抛出的异常也很有用。直接识别抛出的异常及其频率很简单。
YourKit 提供了一个独特的 CPU 分析功能,专注于我们代码的特定部分,如方法或线程内的分支。这个功能很有用,因为它允许通过其 what-if 功能进行条件分析。
YourKit 也允许对 SQL 和 NoSQL 数据库调用进行分析。
5. JProfiler
JProfiler 是由 ej-technologies 创建的 Java 应用程序分析工具。JProfiler 提供了监控内存使用、系统性能、潜在内存泄漏和线程分析的界面,界面友好。
有了这些信息,我们就可以轻松识别系统基础中的优化、移除或修改区域。
JProfiler 是由 ej-technologies 创建的 Java 应用程序分析工具。JProfiler 提供了监控内存使用、系统性能、潜在内存泄漏和线程分析的界面,界面友好。
有了这些信息,我们就可以轻松识别系统基础中的优化、移除或修改区域。
JProfiler
这个 Java 分析器需要购买许可证,但它提供了免费试用。主要关注四个关键领域:
- 方法调用:分析方法调用可以提供对应用程序功能的洞察,并帮助提高其总体性能。
- 分配:通过检查存储在堆中的项、引用关系和管理垃圾收集,这个功能允许你解决内存泄漏并提高内存效率。
- 线程和锁:JProfiler 提供了各种关于线程和锁的分析视角,帮助你识别多线程问题。
- 高级子系统:许多性能问题出现在更高的语义级别。对于 Java 数据库连接中的 JDBC 调用,识别最慢的 SQL 语句至关重要。JProfiler 允许对这些子系统进行集成检查。JProfiler 可以与 IntelliJ IDEA、Eclipse 和 NetBeans 等知名 IDE 集成。甚至可以从快照直接跳转到实际的源代码。
6. NetBeans 分析器
虽然 NetBeans 主要以其出色的调试能力而闻名,但它也出人意料地作为顶级 Java 分析器之一脱颖而出。Oracle 的开源 NetBeans IDE 包括 NetBeans 分析器作为其捆绑包的一部分。它也是进行简便开发和分析的绝佳选择。
Netbeans 分析器
将分析器和调试器的特性结合起来,允许监控代码执行时间和运行时行为,并在多线程等调试方法中提高效率。Netbeans 分析器提高了应用程序的速度,从而提高了内存效率。很棒的是,你可以免费从他们的网站下载它。
虽然 Java VisualVM 和 Netbeans 分析器在特性上相似且都是免费的,但 Netbeans 通过将所有特性捆绑在一个带有 IDE 的程序中而脱颖而出。
7. IntelliJ 分析器
IntelliJ 分析器是一个简单而强大的工具,用于分析 CPU 和内存分配。它结合了两个知名 Java 分析器的能力:JFR 和异步分析器。
尽管提供了一些高级功能,主要侧重点是简单性。IntelliJ 分析器提供了一个无需设置即可开始的简单方法,并为我们的日常开发任务提供了有用的工具。
在 IntelliJ IDEA Ultimate 中,IntelliJ 分析器可以轻松连接到 Java 进程,允许在快照和源代码之间无缝导航。其他方面,如独特的火焰图,使我们能够视觉上评估各种方法的效率,并快速、有效地理解运行时过程。
8. 异步分析器
这个 Java 分析工具具有最小的开销,并避免了 Safepoint 偏见问题。它包括特定于 HotSpot 的 API,用于收集堆栈跟踪和监控内存分配。该分析器与使用 HotSpot JVM 的 OpenJDK 和其他 Java 运行时兼容。
异步分析器能够监控各种类型的事件:
中央处理单元操作
性能计数器,如缓存未命中、分支未命中、页面错误和上下文切换,监控硬件和软件性能。
Java 堆内的内存分配
争用的锁试验,包括 Java 对象监视器和 ReentrantLocks。
在撰写本文时,异步分析器仅支持 Linux 和 Mac 操作系统。如果你使用 IntelliJ IDEA,你不需要安装任何其他东西。集成预先安装,并包括:
- 启动和结束分析会话
- 连接到已经进行中的进程
- 检查分析评估。
9. Arthas
阿里巴巴 Arthas 是一个用于诊断 Java 应用程序的工具,提供跟踪、分析和解决问题的能力。利用 Arthas 的一个主要优势是无需修改代码或重启正在监控的 Java 服务。
Arthas
其他坚实的 Java 分析器
一些值得一提的是 Java Mission Control、New Relic、Glowroot、JMH、Arthas、XRebel/JRebel、JProbe、Pinpoint 和 Stackify Prefix。虽然它们占据市场的份额较小,但它们确实值得认可。