JVM 调优神器,运用 Arthas 释放 Java 应用性能的全部潜力
Arthas、jstack、jstat 和 jmap 都是 Java 调优工具,但它们之间有以下区别:
Arthas 是一款全新的 Java 诊断与调试工具,不仅可以执行传统的 JVM 监控命令,还提供了许多其他高级特性,如实时监控、动态修改代码、反编译等。相比较而言,jstack、jstat 和 jmap 更加基础,只提供了线程栈信息、垃圾回收信息、堆转储信息等。
Arthas 的交互式命令行界面使得开发人员可以通过命令操作来查看和修改目标 JVM 的状态,支持实时监控和动态修改代码,极大地方便了开发和调试过程。而 jstack、jstat 和 jmap 只能通过命令行执行,无法进行实时交互。
Arthas 支持监控线上应用,无需停机,对线上问题快速响应非常有优势。而 jstack、jstat 和 jmap 需要停止 JVM 进程才能进行相关分析。
虽然 Arthas、jstack、jstat 和 jmap 都是 Java 调优工具,但是 Arthas 具有更加强大的功能和交互式的命令行界面,可用于动态修改代码,更适合于在线上环境中进行 JVM 诊断和调试。而 jstack、jstat 和 jmap 更适合本地开发,或者需要停机分析的场景。
一、概述
Arthas 是一款基于 Java 开发的开源应用程序诊断工具,可以帮助开发者实时监控和分析 Java 应用程序运行情况,并进行调试和优化。
Arthas 提供了丰富的命令行工具和可视化界面,包括线程堆栈、类加载器、内存使用情况、方法执行时间等多个方面的信息,可以帮助用户快速定位并解决应用程序中的性能问题和异常情况。同时,Arthas 还支持对生产环境中的应用程序进行远程诊断和操作,极大地提高了应用程序的故障排查效率和可靠性。
当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到 JVM 的实时运行状态?怎么快速定位应用的热点,生成火焰图?怎样直接从 JVM 内查找某个类的实例?
二、快速入门
2.1. 启动 math-game
math-game 是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
math-game 源代码:查看在新窗口打开
2.2. 启动 arthas
在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):
选择应用 java 进程:
math-game 进程是第 1 个,则输入 1,再输入回车/enter。Arthas 会 attach 到目标进程上,并输出日志:
如何出现如下异常:
[ERROR] Can not read arthas version from: arthas.aliyun.com/api/latest_…[ERROR] Can not find Arthas under local: /root/.arthas/lib and remote repo mirror: aliyun[ERROR] Unable to download arthas from remote server, please download the full package according to wiki: github.com/alibaba/art…
按照提示到 github 上下载完整包。下载地址:github.com/alibaba/art…到 release 下载 arthas-bin.zip
解压 arthas-bin.zip 后,直接运行 java -jar arthas-boot.jar 然后输入对应的 java 进程序号就可以进行 arthas 了。
2.3. 查看 dashboard
输入 dashboard,按回车/enter,会展示当前进程的信息,按 ctrl+c 可以中断执行。
2.4. 通过 thread 命令来获取到 math-game 进程的 Main Class
thread 1 会打印线程 ID 1 的栈,通常是 main 函数的线程。
2.5. 通过 jad 来反编译 Main Class
2.6. watch
通过 watch 命令来查看 demo.MathGame#primeFactors 函数的返回值:
更多的功能可以查看进阶使用。
2.7. 退出 arthas
如果只是退出当前的连接,可以用 quit 或者 exit 命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出 arthas,可以执行 stop 命令。
2.8.命令总汇
1)help:查看所有可用的 Arthas 命令和说明。
2)jvm:查看当前 JVM 的相关信息,包括堆大小、GC 策略、线程数等。
3)classloader:查看和操作类加载器信息,包括已加载的类、类加载器层级等。
4)thread(cpu 占用过高/死锁):查看和操作线程状态和堆栈信息,包括线程数量、状态、阻塞信息等。
5)trace(方法耗时及跟踪 ):跟踪指定方法的执行情况,输出方法参数、返回值、耗时等信息。
6)watch(查看函数的参数/返回值/异常信息):监控指定方法的执行情况,当指定条件满足时自动触发相应的操作。
7)sc:查看和操作 Spring 上下文信息,包括 Bean 定义、Bean 生命周期等。
8)sql:查看和操作数据库连接和 SQL 执行情况,支持常见的 JDBC 驱动程序。
9)dashboard(内存泄漏):启动 Arthas 的可视化界面,展示当前应用程序的各种运行情况。
10) jad:反编译源代码
11)tt:
发现异常并查看异常 tt -t com.UserServiceImpl check //记录方法调用信息
tt -i 1001 //上面指令发现异常后,查看异常
tt -i 1001 -p //重新调用,重现异常
查看、更新类成员变量值
ognl '@com.Arthas@hashSet' //查看
ognl '@com.Arthas@hashSet.add("test")' //更新
作者:玄明 Hanko
链接:https://juejin.cn/post/7234545968094773307
来源:稀土掘金
评论