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 更适合本地开发,或者需要停机分析的场景。
1、概述
Arthas 是一款基于 Java 开发的开源应用程序诊断工具,可以帮助开发者实时监控和分析 Java 应用程序运行情况,并进行调试和优化。
Arthas 提供了丰富的命令行工具和可视化界面,包括线程堆栈、类加载器、内存使用情况、方法执行时间等多个方面的信息,可以帮助用户快速定位并解决应用程序中的性能问题和异常情况。同时,Arthas 还支持对生产环境中的应用程序进行远程诊断和操作,极大地提高了应用程序的故障排查效率和可靠性。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到 JVM 的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
怎样直接从 JVM 内查找某个类的实例?
2、快速入门
2.1. 启动 math-game
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
math-game源代码:查看在新窗口打开
2.2. 启动 arthas
在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择应用 java 进程:
math-game进程是第 1个,则输入 1,再输入回车/enter。Arthas 会 attach 到目标进程上,并输出日志:
[INFO] Try to attach process 71560
[INFO] Attach process 71560 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki: https://arthas.aliyun.com/doc
version: 3.0.5.20181127201536
pid: 71560
time: 2018-11-28 19:16:24
$
如何出现如下异常:
[ERROR] Can not read arthas version from: https://arthas.aliyun.com/api/latest_version
[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: https://github.com/alibaba/arthas
按照提示到github上下载完整包。下载地址:https://github.com/alibaba/arthas到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 函数的线程。
$ thread 1 | grep 'main('
at demo.MathGame.main(MathGame.java:17)
2.5. 通过 jad 来反编译 Main Class
2.6. watch
通过watch命令来查看demo.MathGame#primeFactors函数的返回值:
$ watch demo.MathGame primeFactors returnObj
更多的功能可以查看进阶使用。
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")' //更新
===========================================
如果文章对你有帮助,不要忘记加个关注、点个赞!