> 文档中心 > 线上简单实用的阿里巴巴 Java 诊断工具 Arthas 强烈推荐使用

线上简单实用的阿里巴巴 Java 诊断工具 Arthas 强烈推荐使用

Arthas 是什么?

Arthas是阿里巴巴开源的 Java诊断工具,基本使用场景是定位复现一些生产环境比较难以定位问题。可以在线排查问题,以及动态追踪Java代码,实时监控JVM状态等等

github : https://github.com/alibaba/arthas

wiki: https://alibaba.github.io/arthas/

f32fccd746c1b9d2d556f8cb4d0caf3c.png

当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception

  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

  5. 是否有一个全局视角来查看系统的运行状况?

  6. 有什么办法可以监控到JVM的实时运行状态?

Arthas 功能特性

  1. 查看类加载情况

  2. 反编译

  3. 热更新

  4. 分析方法的入参和返回值

  5. 跟踪慢调用

  6. 找出阻塞线程

Arthas 的安装与快速启动

  1. 下载启动

    jarwget https://alibaba.github.io/arthas/arthas-boot.jar

  2. 启动 java -jar arthas-boot.jar

40d7a373e47b639f1bd2856cccf0d321.png

常用功能

1. dashboard

当前系统的实时数据面板。

数据说明

  • ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应

  • NAME: 线程名

  • GROUP: 线程组名

  • PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高

  • STATE: 线程的状态CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。

  • TIME: 线程运行总时间,数据格式为分:秒

  • INTERRUPTED: 线程当前的中断位状态

  • DAEMON: 是否是daemon线程

2. thread

查看当前线程信息,查看线程的堆栈。

  1. thread  展示所有线程信息

  2. thread -n 3  展示当前最忙的3个线程

  3. thread id  显示指定线程的运行堆栈

  4. thread -b 找出当前阻塞其他线程的线程

44485b7c876e1afca4efbdb153f8d515.png

3. trace

跟进方法调用路径,并打印每个方法运行时间

trace com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl dailyReportV2

打印方法调用栈信息及运行时间

44185de51e70083b7c46756268c812dd.png

  • -j 过滤掉 jdk 函数

-j: jdkMethodSkip, skip jdk method trace
  • 同时跟踪多个方法

trace -j -E com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl dailyReport|dailyReportV2
  • 同时跟进多个 耗时超过10ms的方法

trace -j -E com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl dailyReport|dailyReportV2 '#cost > 10'

4. watch

方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参

  • 查看方法入参和返回值

watch com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl dailyReportV2 "{params,returnObj}" -x 2
  • 只查看方法入参

watch com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl dailyReportV2 "{params,returnObj}" -x 2 -b
  1. -x 表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是1

  2. -e 表示抛出异常时才触发

#cost>200(单位是ms)表示只有当耗时大于200ms时才会输出,过滤掉执行时间小于200ms的调用

4. sc

查看JVM已加载的类信息。

sc -d com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl
  • 打印类的详细信息 & 属性信息

sc -d -f com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl
  • 模糊搜索

sc com.xuebaclass.sato.cont*

5. sm

查看已加载类的方法信息。

  • 打印类的详细信息

sm com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl
  • 打印类的详细信息 & 属性信息

sm -d -f com.xuebaclass.sato.service.impl.ReportWorkSpaceServiceImpl

参考

  • https://arthas.gitee.io/commands.html