Arthas 介绍和实操演示

1,294 阅读2分钟

介绍

1. Arthas是什么?

Alibaba开源的Java诊断工具:https://arthas.aliyun.com/doc

2. Arthas能解决什么问题?

如下疑惑都能解决

1)为什么开发环境功能是好的,测试环境不行?是代码没打包成功?还是程序确实有问题?
(2)这个请求调用链路这么深,跑到我负责的这个方法,入参、出参是多少?刚好有个字段没有打印,需要加个日志重新部署一下?
(3)为什么接口这么慢啊?瓶颈点具体在哪个点?难道要每一行加上时间日志定位?
(4)为什么我的静态变量获取不到?值对不上?
(5)测试主流程卡住了,不想重新部署,能不能先做个热更新,不阻碍测试和其他开发人员的进度?
(6)是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到JVM的实时运行状态?
(7)为什么会报各种类相关的 Exception?这个类究竟是从哪个类加载器加载的?

实操

1. 启动应用程序

java -jar life-account-0.0.1-SNAPSHOT.jar > account.log &

2. 启动Arthas

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择需要监听的应用

image.png

3. dashboard

查看应用基本情况:  
(1)忙线程  
(2)内存使用情况(堆、非堆)
(3)GC情况(YFC和FGC次数、耗时)
(4)系统情况(系统版本、JDK版本、程序运行时长)

image.png

4. thread

thread命令参数
    id:可以查看指定线程id的堆栈信息 
    -n value:找出最忙的value个线程,并打印堆栈信息 
    -b:找出当前正在阻塞其他线程的线程 
    -i value:指定采样cpu占比的时间间隔,默认为100ms
示例:抓最忙的2个线程的堆栈信息
thread -n 2

image.png

5. jad

反编译

jad com.satan.account.service.impl.UserServiceImpl

image.png

6. watch

监控目标方法,查看入参,出参和异常信息
命令格式:watch <类的全限定名> <方法名> '{params, returnObj, throwExp}'

watch com.satan.account.service.impl.UserServiceImpl getByUsernameAndPwd "{params,returnObj}" -x 2

image.png

7. getstatic

获取类的静态属性值
getstatic com.satan.account.controller.AccountController developer

image.png

8. trace

统计整个方法调用链路上的所有性能开销和追踪调用链路,用于快速定位性能瓶颈
命令格式:trace <类的全限定名> <方法名>

trace com.satan.account.controller.AccountController login

image.png

9. 热更新

(1) 用 `jad` 反编译出 `.java` 文件,并且vim文件修改代码
jad --source-only com.satan.account.service.impl.UserServiceImpl > /satan/UserServiceImpl.java
(2) 找到加载该类的类加载器(需要用类加载器加载新的class文件)
sc -d com.satan.account.service.impl.UserServiceImpl /satan/UserServiceImpl.java
(3) 用`mc` 编译修改后的文件
mc -c 238e0d81 /satan/UserServiceImpl.java
(4) 用`redefine` 热更新
redefine -c 238e0d81 /satan/com/satan/account/service/impl/UserServiceImpl.class
(5) 验证
curl -d '{"pwd": "666666", "username": "张三"}' -H 'Content-Type: application/json' http://localhost:8070/account/user

复杂的类可用IDEA 编译好,上传到服务器,跳过前面3步骤,直接操作第4步即可
操作示例:

image.png

image.png

image.png