arthas使用
概述
Arthas 是Alibaba开源的Java诊断工具,可以直接安装在服务器上,用于开发人员或者运维人员查找问题,分析性能,bug追踪 等
能够解决什么问题?
-
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
-
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
-
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
-
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
-
是否有一个全局视角来查看系统的运行状况?
-
有什么办法可以监控到JVM的实时运行状态?
-
怎么快速定位应用的热点,生成火焰图?
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
如何开始?
直接输入一下命令下载jar包
直接通过一下命令启动jar包
java -jar arthas-boot.jar
或则直接上官网开始学习https://arthas.aliyun.com/doc/en/quick-start.html
输入命令会有如下打印:
$ $ java -jar arthas-boot.jar
* [1]: 35542
[2]: 71560 arthas-demo.jar
注意:选择一个进程进入选择【1】【2】这种不是pid
进入后会有如下打印并且可以使用arthas命令进行进程查看等
此时用户信息也变为arthas了 【arthas@6794】
使用基本arthas命令
dashboard:查看当前进程的简要报告(包括线程信息、内存信息、gc信息、还有一些运行时的数据)
thread 1 将id为1的进程堆栈打印(这个进程id在dashboard命令使用后可以看到)
jad:可以反编译出类的信息,通过jad 类全限定名
watch:可以查看方法的返回数据对象 通过watch 类全限定名 方法名
quit或exit与当前进程断开连接。附加到目标进程的Arthas实例继续存在于该进程中,并且其端口处于备用状态以供进一步连接。
stop命令使Arthas完全退出目标进程。
jvm:查看java虚拟机的当前信息
sysprop:从目标JVM检查系统属性
sysenv:查看当前的JVM环境变量
mc:内存编译器,将.java文件编译为.class内存中的文件。-c指定类加载器 -d指定输出的目录
sc:查看加载类的相关详情,比如当前类是从什么jar包加载的
sm:查看加载类的方法详情
getstatic:查看类的静态属性
redefine:加载外部*.class文件以重新定义JVM中已加载的类
ognl:可以执行任意的代码
classloader:展示类加载器信息统计并形成树型结构
启动常出现的坑
-
[ERROR] Target process 24255 is not the process using port 3658, you will connect to an unexpected process. [ERROR] 1. Try to restart arthas-boot, select process 30482, shutdown it first. [ERROR] 2. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
上面的错误是端口占用的问题,arthas默认开启3658连接jvm。但是这个端口被占用就会出现错误。
端口占用解决办法
如上,自己指定端口或则关闭之前被占用的端口。
java -jar arthas-boot.jar --telnet-port 端口号 --http-port -1 修改端口
第一种
quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
第二种
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
stop——和shutdown命令一致
这里就是可能开启多个arthas异常关闭导致重新启动连接端口占用问题,通过shutdown或则stop关闭所有arthas重新连接