Arthas - 开源的java诊断工具,非常有用

常用命令

help                查看帮助
help COMMAND        查看指定命令的详细帮助
COMMAND -h          查看指定命令的详细帮助
double tab          查看支持的所有命令

thread                  查看所有线程
thread 51               查看指定线程堆栈
thread -n 5             查看前5个线程堆栈
thread -n -1            查看所有线程堆栈
thread -b               查看阻塞线程
thread -i 2000          在计算CPU使用率时指定采样间隔(2秒后输出结果)

jad javax.servlet.Servlet       对jvm已加载的类进行反编译
(java -jar cfr-0.148.jar /tmp/TestClass.class 可以反编译class文件,org.benf:cfr0.148)
mc /tmp/Test.java               编译java文件

sc javax.servlet.Servlet        查找jvm已加载的类
sc -d javax.servlet.Servlet     查找jvm已加载的类,打印详细

stack com.TestClass testMethod            查看方法的调用堆栈,重新触发后打印

trace com.TestClass testMethod            查看方法的子调用方法的耗时

watch com.TestClass testMethod  {params[0], throwExp} -e    方法抛出异常时查看方法的传入参数,仅当方法抛出异常时才打印(未测试)

monitor -c 3 com.TestClass testMethod                       监控方法的调用次数,成功率等信息,每隔3秒输出一次。

classloader                                                 查看类加载器数量,以及每个加载器加载的类数量

【redefine + sc + jad】                                  实现不重启加载class
redefine                                                加载外部的.class文件,redefine jvm已加载的类
redefine -c ClassLoaderHash /tmp/TestClass.class        将修改后编译出来的class文件放到指定目录,并redefine
其中ClassLoaderHash为该类的类加载器HashCode,可通过"sc com.TestClass -d"查询
必须指定ClassLoaderHash,否则修改不生效
注意:原本以为redefine后通过"jad com.TestClass"反编译看一下是否修改,然而反编译一下立刻还原修改了,需要再次redefine(这就是还原的办法了)


【tt】
tt                                          记录方法调用的时间片信息
tt -t com.TestClass testMethod              开始记录
(https://alibaba.github.io/arthas/tt  #方法重载问题-解决方法重载)
tt -l                                       查看历史记录
tt -i ID                                    查看某个时间片信息(含参数值)
tt -i ID -w params[0]                       查看时间片方法的第一个参数的值
tt -i ID -w params[0].length()              查看时间片方法的第一个参数的值,支持对象访问
tt -i ID -w {params[0],param[1]}            查看时间片方法的多个参数的值
(-w 观察表达式,https://alibaba.github.io/arthas/advice-class.html)

使用/安装指南

【下载工具】
https://alibaba.github.io/arthas/arthas-boot.jar
或
https://alibaba.github.io/arthas/install.sh(sh install.sh下载启动脚本as.sh)
 
【使用条件】
环境需要安装java
依赖jdk/lib/tools.jar
如果只有jre,可拷贝jdk的tools.jar到jre/lib/下
as.sh需要telnet命令,若无telnet可使用arthas-boot.jar方式
 
【启动工具】
java -jar arthas-boot.jar 或 sh as.sh

第一次启动会下载arthas-3.1.4-bin.zip到/root/.arthas/lib/3.1.4/arthas下并解压。
每次启动会检测是否有java进程,然后输入数字选择需要诊断的进程。(PS:工具检测进程的原理$JAVA_HOME/bin/jps -l -v)
sh as.sh --repo-mirror aliyun         //如果下载速度比较慢,可以使用aliyun的镜像
sh as.sh --target-ip 192.168.1.9      //指定telnet监听IP
sh as.sh -h                           //查看更多启动配置
sh as.sh PID                          //指定进程诊断

linux-8ku8:/opt/arthas # sh as.sh
Arthas script version: 3.1.4
[INFO] JAVA_HOME: /opt/jdk1.8.0_74
[INFO] Process 10528 already using port 3658
[INFO] Process 10528 already using port 8563
Found existing java process, please choose one and hit RETURN.
* [1]: 10528 org.apache.catalina.startup.Bootstrap

【默认自动下载目录】
linux-8ku8:~/.arthas/lib/3.1.4/arthas # ls -lh
total 22M
-rw-r--r-- 1 root root  11M Jun 22 16:13 arthas-3.1.4-bin.zip
-rw-r--r-- 1 root root 8.2K Sep 25  2019 arthas-agent.jar
-rw-r--r-- 1 root root 109K Sep 25  2019 arthas-boot.jar
-rw-r--r-- 1 root root 394K Sep 25  2019 arthas-client.jar
-rw-r--r-- 1 root root  11M Sep 25  2019 arthas-core.jar
-rw-r--r-- 1 root root 3.7K Sep 25  2019 arthas-demo.jar
-rw-r--r-- 1 root root 2.9K Sep 25  2019 arthas-spy.jar
-rwxr-xr-x 1 root root 7.6K Sep 25  2019 as-service.bat
-rwxr-xr-x 1 root root 3.1K Sep 25  2019 as.bat
-rwxr-xr-x 1 root root  28K Sep 25  2019 as.sh
-rwxr-xr-x 1 root root  635 Sep 25  2019 install-local.sh

【启动成功】
linux-8ku8:/opt/arthas # sh as.sh
........
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'
........
[arthas@10528]$ help                   //查看帮助;double tab查看支持的所有命令;help COMMAND查看指定命令的详细帮助
[arthas@10528]$ exit                   //断开连接,工具还在运行。重新执行as.sh可再次进入,或者telnet 127.0.0.1 3658也可再次重连(后者连接速度超快)
[arthas@10528]$ shutdown 或 stop       //关闭工具

【离线安装】
将arthas-3.1.4-bin.zip解压到/root/.arthas/lib/3.1.4/arthas/目录下
非root用户解压到/home/$USER/.arthas/lib/3.1.4/arthas/目录下,注意修改文件的用户属组
然后启动即可,不同用户下执行as.sh,会调用各自用户家目录下的arthas

【Arthas用户文档】
https://github.com/alibaba/arthas/edit/master/README_CN.md
https://alibaba.github.io/arthas/dashboard

猜你喜欢

转载自www.cnblogs.com/zhangzongjian/p/11790074.html