是什么
Arthas
是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。可以解决如下常见问题:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从JVM内查找某个类的实例?
安装以及开始使用
https://arthas.aliyun.com/doc/quick-start.html
常见命令以及使用
https://arthas.aliyun.com/doc/commands.html
问题场景解决
-
方法内部调用路径,并输出方法路径上的每个节点上耗时 trace xx类.xx方法 run
$ trace demo.MathGame run Press Ctrl+C to abort. Affect(class-cnt:1 , method-cnt:1) cost in 42 ms. `---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;[email protected] `---[10.611029ms] demo.MathGame:run() +---[0.05638ms] java.util.Random:nextInt() +---[10.036885ms] demo.MathGame:primeFactors() `---[0.170316ms] demo.MathGame:print() 过滤掉jdk的函数 trace -j demo.MathGame run 调用耗时过滤 trace demo.MathGame run '#cost > 10'
- watch 查看方法入参,出参信息。stack 查看方法的调用路径。tt 命令可以记录打印出某方法的执行详情,并观察不同时间,不同入参的执行情况。【大多是线下无法重现问题,而线上又不能有debug环境时】
- 使用 dashboard 命令可以概览程序的 线程、内存、GC、运行环境信息。
- 使用 thread查看所有线程信息,同时会列出每个线程的
使用率,可以看到图里 ID 为12 的线程 CPU 使用100%。CPU
- 如果只是为了寻找 CPU 使用较高的线程,可以直接使用命令 thread -n [显示的线程个数] ,就可以排列出 CPU 使用率 Top N 的线程。