java线上问题排查工具——Arthas

  1. 视频讲解 https://www.bilibili.com/video/BV1FD4y1j73p
  2. https://d9bp4nr5ye.feishu.cn/wiki/wikcnmjhfgMGVLSigeMVLYbpVVX
  3. 官方文档 https://arthas.aliyun.com/doc/

一、安装

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、其它
  1. cls 清空控制台
  2. history 查看历史的命令
  3. pwd 查看当前目录
  4. quit 推出 arthas
  5. reset 重制所有的 arthas的增强操作
  6. stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出。会重置掉所有做过的增强类,但是用 redefine 重加载的类内容不会被重置。
  7. 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种

  1. 把你本地的 class上传到服务器
  2. 通过 arthas的 jad命令来把 class反编译成 java ,mc 命令来把 java 编译成 class
  3. 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、监控线上代码

  1. monitor 间隔N秒,统计 某个方法 成功次数、失败次数、平均耗时、失败率
  2. stack 打印整个栈的信息,太长了感觉没啥用
  3. 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、参数过滤
  1. https://github.com/alibaba/arthas/issues/71
  2. 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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值