Arthas简介
Arthas 出处
Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,是排查问题的瑞士军刀,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:
-
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
-
遇到问题无法在测试环境 debug,难道只能通过加日志再重新发布吗?
-
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
-
是否有一个全局视角来查看系统的运行状况?
Arthas 采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
Arthas 架构
Arthas是C/S模式,多个Client,只有一个Server,目标Java进程只需被 attach 一次。其中bytekit是阿里开源的字节码增强工具包,可以在目标Java进程增强代码,实现monitor/watch/trace等功能。arthas的实现原理主要使用了JVM Attach API、Java Instrumentation 接口、字节码增强等技术。类似的工具还有JProfiler,不过JProfiler收费、界面复杂,相比之下arthas免费开源、易用方便。
Arthas 技能树
实践 查看方法入参/返回值/异常
使用Arthas attach目标Java进程:
java -jar ~/Desktop/arthas-boot-3.4.6.jar
复制代码
查看入参/返回值/异常:
watch <类名表达式> <方法名表达式> '{params,returnObj,throwExp}' -x 2
复制代码
可以使用IDEA插件生成命令
支持根据入参进行条件过滤(-x 表示遍历深度):
watch <类名表达式> <方法名表达式> '{params,returnObj,throwExp}' 'params[0]<0' -x 2
复制代码
HTTP请求500/404/401时,不用再担心没加日志。
实践 定位应用性能热点
使用trace命令跟踪方法的子调用
trace <类名表达式> <方法名表达式>
复制代码
cpu/heap 火焰图
开始采集:
profiler start --event cpu/alloc
复制代码
结束采集:
profiler stop --format html/svg
复制代码
cpu火焰图(大平顶是可能有性能问题的函数)
heap火焰图(顶部是heap中数量较多的对象)
实践 热更新代码
测试环境想改行代码、加行日志输出,commit、push、publish、等应用重启?一顿操作下来,10分钟过去了,人生苦短,试试在线热更新代码(PHP、Python等动态语言的优势之一):
1 反编译代码
jad --source-only 类名表达式 > /tmp/Foo.java
复制代码
2 查找加载目标类的ClassLoader
sc -d 类名表达式 | grep classLoaderHash
复制代码
3 内存编译
mc --classLoaderClass 类加载器 Foo.java -d /tmp
复制代码
4 更新类的字节码
retransform /path/Foo.class
复制代码
更新完代码,想重放调用,恳求测试人员再触发几次?测试人员太忙,测试人员不在电脑旁,只能空等吗,如何快速重放调用?
时空隧道TimeTunnel(tt命令会记录一次调用所有现场信息):
tt -t <类名表达式> <方法名表达式> -n <记录调用次数>
复制代码
重放 INDEX 为1001的调用:
tt -i 1001 -p
复制代码
查看 INDEX 为1001的调用详情:
tt -i 1001 // 会打印入参/返回值/异常
复制代码
实践 解决类冲突
查看ClassLoader的继承树(使用classloader命令可以查询类来自哪个jar、由哪个ClassLoader加载):
classloader -t
复制代码
使用ClassLoader定位类加载路径:
classloader -c <classLoaderHash> -r java/lang/String.class
复制代码
更多 arthas 命令参考: