Arthas 线上环境问题排查
开源地址:https://github.com/alibaba/arthas
在使用 Arthas 之前,当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,你需要查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof 等一通操作。最终焦头烂额,还不一定能查出问题所在。而现在,大多数的常见问题你都可以使用 Arthas 轻松定位,迅速解决,及时止损,准时下班。
1.0 arthas 能帮你解决的问题
- 这个类从哪个jar包加载的?为什么会报各种类相关的Exception
- 我改的代码为什么没有执行到,没有部署?
- 遇到问题无法在线上进行debug,难道只能加日志重新发布?
- 线上遇到问题,无法debug,线下无法重现
- 是否有一个全局的视角来查看系统的运行状况?
- 有什么方法可以监控到JVM的实时运行状态
- 怎么快速的定位应用的热点,生成火焰图?
2.0 快速安装
https://github.com/alibaba/arthas/blob/master/README_CN.md
3.0 常用命令
命令可以查看当前系统的实时数据面板。可以查看到CPU、内存、GC、运行环境等信息。 输入 q
或者 Ctrl+C
可以退出dashboard命令。
thread
查看当前进程的所有线程
thread ID
查看指定线程ID的线程
thread -n 3
展示当前最忙的前3个线程并打印堆栈信息
thread -b
找出当前阻塞其它线程的线程,排查死锁
thread -i 1000 -n 3
指定采样时间间隔,并展示最忙碌的3个线程
thread --state 线程状态
查看处于锁定状态的线程
jad 包名.类名
反编译 (需要类被加载到JVM中)
jad 包名.类名
包含有类加载器+位置+源码
jad 包名.类名 --source-only
只包含反编译后的源码
jad 包名.类名 方法名
反编译指定的方法
jad 包名.类名 > 存放路径名
反编译类,并存放在指定的文件下
watch
观察指定方法的调用情况
watch 包名.类名 方法名 "{params,returnObj}" -x 2
,监视方法出参和返回值,-x
表示指定输出结果的属性遍历深度,默认为1,params表示所有参数数组,returnObject表示返回值
watch 包名.类名 方法名 "target" -x 2
观察当前对象中的所有属性,target
表示当前对象
watch 包名.类名 方法名 "target.field_name" -x 2
观察当前对象中的指定属性 target.field_name
指定对象中的某个属性
watch 包名.类名 方法名 "{params,target,returnObj}" -x 2 -b -s -n 2
同时观察方法调用前和方法返回后,参数-n 2
表示只执行两次。params
表示参数,target
表示执行方法的对象,returnObj
表示返回值
退出 arthas
quit
或exit
只是退出当前连接,端口会保持开放stop
结束会话,完全退出 arthas