arthas 是阿里开源的线上诊断工具,挺好用的,开源地址:https://github.com/alibaba/arthas, 官方文档官方开源文档 挺详细,建议直接去看。
到上面的开源地址下载 arthas-boot.jar,下载和启动命令如下。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
下载脚本文件
curl -L https://alibaba.github.io/arthas/install.sh | sh
交互模式启动
./as.sh pid
当前运行的内存信息,包括堆内内存(eden,survivor,old区)和堆外内存(包括code cache, perm区,direct buffer等)的使用情况
thread -n 3 当前最忙的前N个线程并打印堆栈
thread -b 找出当前阻塞其他线程的线程
thread threadNo 根据线程ID可以查看thread的运行堆栈
方法内部调用路径,并输出方法路径上的每个节点上耗时
trace com.taobao.trip.has.service.impl.HotelSettle4TestServiceImpl getHotelOrderDetailVo
查看方法调用链
stack test.arthas.TestStack doGet
方法调用次数、成功率统计
$ monitor -c 5 org.apache.dubbo.demo.provider.DemoServiceImpl sayHello
watch com.xxx.service.impl.xxxxServiceImpl methodName "{params,returnObj}" -f
watch com.xxx.service.impl.xxxxServiceImpl methodName "{params,returnObj}" -x 2
(可以看到参数)
watch com.xxx.service.impl.xxxxServiceImpl methodName "{params,returnObj}" -x 2
看异常:
watch com.xxx.service.impl.xxxxServiceImpl methodName "{params,returnObj,throwExp}" -e -x 2
关闭: shutdown
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。
于是乎,TimeTunnel 命令就诞生了。
$ tt -t demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors
1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors
1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
命令参数解析:
tt 命令有很多个主参数,-t 就是其中之一。这个参数的表明希望记录下类 *Test 的 print 方法的每次执行情况。
当你执行一个调用量不高的方法时可能你还能有足够的时间用 CTRL+C 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。
此时你可以通过 -n 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。
官方开源文档