posts
Java线上排查问题工具——Arthas
阿里开源的 Java 在线诊断工具,无需重启应用即可查看方法调用、监控耗时。
Java线上排查问题工具——Arthas
Java线上问题排查工具—arthas_哔哩哔哩_bilibili
https://arthas.aliyun.com/doc/
一、安装
| Shellcurl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar curl -L https://arthas.aliyun.com/install.sh | sh | | :— |
二、场景
2-1、查看当前服务运行的参数 JVM、内存、启动参数等
1、memory
查看当前堆和非堆的内存使用情况

2、thread
| Shell# 查看全部的线程状态 thread # 查看当前最忙的 n个线程 thread -n # 查看被阻塞的线程 thread -b |
|---|
3、查看当前类的方法
| Shellsm cn.data.process.api.ApiApplication |
|---|
4、其它
cls 清空控制台
history 查看历史的命令
pwd 查看当前目录
quit 推出 arthas
reset重制所有的 arthas的增强操作
stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出。会重置掉所有做过的增强类,但是用 redefine 重加载的类内容不会被重置。
version 查看当前的 arthas 的版本
2-2、查看线上源码
| Shell# 查看源码 jad cn.data.process.api.ApiApplication # 保存反编译的源码 jad –source-only com.example.demo.arthas.user.UserController > /UserController.java |
|---|
2-3、修改线上源码
修改的原理就是 把 新的class 加载到JVM 里面去,生成 class的方式有2种
把你本地的 class上传到服务器
通过 arthas的 jad命令来把 class反编译成 java ,mc 命令来把 java 编译成 class
retransform 命令把 class加载到 jvm中去
方法一就没什么好说了,来看方式二
| Shell# 1、从原class 里面复制出新的 java文件(有可能反编译会有问题,建议先检查下结果) jad –source-only cn.data.process.api.web.WkDataController > /WkDataController.java # 2、修改java里面的内容为你想要的内容 # 3、使用 mc 把你的java 编译成 class mc /WkDataController.java -d / # 4、把新的class 加载到JVM中去 retransform /cn/data/process/api/web/WkDataController.class |
|---|
**2-4、监控线上代码 **
monitor 间隔N秒,统计 某个方法 成功次数、失败次数、平均耗时、失败率
stack 打印整个栈的信息,太长了感觉没啥用
trace 监控某个方法各个步骤的耗时
**1、monitor **
| Shell# 每隔 5s 监控一下WkDataController 类的 test 方法 monitor -c 5 cn.data.process.api.web.WkDataController test |
|---|

2、stack
打印整个栈的信息,太长了感觉没啥用
| Shellstack cn.data.process.api.web.WkDataController test2 |
|---|
3、trace (排查慢接口好帮手)
| Shell# 监控一下WkDataController 类的 test 方法的执行耗时 trace cn.data.process.api.web.WkDataController test |
|---|

4、参数过滤
https://github.com/alibaba/arthas/issues/71
https://github.com/alibaba/arthas/issues/11
上面的监控虽然很好,但在实际的项目中,我们的访问量很大,我们想要监控某个请求这时候通过参数过滤将会是完美的方案。
4-1、监控某个参数的值
| Java@GetMapping("/test1") public void test1(@RequestParam String str, @RequestParam Integer age) { System.out.println(str + " " + age); } # 监控 str == zxc trace cn.data.process.api.web.WkDataController test1 “params[0] == ‘zxc’” # 监控 age >= 1 trace cn.data.process.api.web.WkDataController test1 “params[1] >= 1” |
|---|
| Java@PostMapping("/test2") public void test2(@RequestBody TestDTO testDTO) { System.out.println(testDTO.getName() + " " + testDTO.getAge()); } # 监控 name == 111 trace cn.data.process.api.web.WkDataController test2 “params[0].name == ‘111’” |
|---|
2-5、修改日志的级别
Arthas 支持修改每个类的日志级别,这里只演示修改整个系统的日志级别 Arthas-logger
| Shell# 1、查看日志信息 logger # 2、修改日志的隔离级别 logger –name ROOT –level debug |
|---|