-
一、安装
-
二、场景
-
2-1、查看当前服务运行的参数 JVM、内存、启动参数等
-
2-2、查看线上源码
-
2-3、修改线上源码
-
2-4、监控线上代码
-
2-5、修改日志的级别
一、安装
curl -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
# 查看全部的线程状态
thread
# 查看当前最忙的 n个线程
thread -n
# 查看被阻塞的线程
thread -b
3、查看当前类的方法
sm cn.data.process.api.ApiApplication
4、其它
-
cls
清空控制台 -
history
查看历史的命令 -
pwd
查看当前目录 -
quit
推出 arthas -
reset
重制所有的 arthas的增强操作 -
stop
关闭 Arthas 服务端,所有 Arthas 客户端全部退出。会重置掉所有做过的增强类,但是用 redefine 重加载的类内容不会被重置。 -
version
查看当前的 arthas 的版本
2-2、查看线上源码
# 查看源码
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中去
方法一就没什么好说了,来看方式二
# 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
# 每隔 5s 监控一下WkDataController 类的 test 方法
monitor -c 5 cn.data.process.api.web.WkDataController test
2、stack
打印整个栈的信息,太长了感觉没啥用
stack cn.data.process.api.web.WkDataController test2
3、trace (排查慢接口好帮手)
# 监控一下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、监控某个参数的值
@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"
@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 支持修改每个类的日志级别,这里只演示修改整个系统的日志级别 https://arthas.aliyun.com/doc/logger.html
# 1、查看日志信息
logger
# 2、修改日志的隔离级别
logger --name ROOT --level debug
原文始发于微信公众号(小道仙97):Java线上问题排查工具—Arthas
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204499.html