Java线上问题排查工具—Arthas


  • 一、安装

  • 二、场景

    • 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

查看当前堆和非堆的内存使用情况Java线上问题排查工具—Arthas

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

Java线上问题排查工具—Arthas

2、stack

打印整个栈的信息,太长了感觉没啥用

stack cn.data.process.api.web.WkDataController test2


3、trace  (排查慢接口好帮手)

# 监控一下WkDataController 类的 test 方法的执行耗时
trace cn.data.process.api.web.WkDataController test

Java线上问题排查工具—Arthas

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


原文始发于微信公众号(小道仙97):Java线上问题排查工具—Arthas

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204499.html

(0)
java面试题的头像java面试题

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!