Arthas研究笔记(Java诊断工具)

Java诊断工具-Arthas

  • 使用场景
    • 1.排查函数调用异常现象
    • 2.热更新代码
    • 3.动态更新应用Logger Level
    • 4.获取Spring Context
  • 命令列表
    • dashboard 显示当前系统的实时数据面板
    • thread 查看当前线程信息,查看线程的堆栈
    • jvm 查看当前JVM信息
    • sysprop 查看当前JVM的系统属性(System Property)
    • sysenv 查看当前JVM的环境属性(System Environment Variables)
    • vmoption 查看,更新VM诊断相关的参数
    • getstatic 查看类的静态属性
    • sc 查看JVM已加载的类信息
    • sm 查看已加载类的方法信息
    • jad 反编译指定已加载类的源码
    • classloader 查看类加载信息
    • mc 编译.java文件生成.class
    • redefine 加载外部的.class文件
    • monitor 方法执行监控
    • watch 方法执行数据观测
    • tt 方法执行数据的时空隧道
    • cat 打印文件内容
    • pwd 返回当前的工作目录
    • Arthas 基础命令

Arthas可以帮助你解决:

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

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

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

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

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

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

使用场景

需下载jar包:

arthas-demo.jar
arthas-boot.jar	
demo-arthas-spring-boot.jar

启动方式:

1、java -jar demo-arthas-spring-boot.jar
2、java -jar arthas-boot.jar --target-ip 0.0.0.0
3、java -jar arthas-demo.jar
4、在列出的java线程中,选择要诊断的线程索引

Web Socket连接

支持通过Web Socket来连接,访问路径如下:
http://localhost:8563/

1.排查函数调用异常现象

支持的内置对象:
loader	//类加载器对象
clazz	//类对象
method	//方法对象
target	//目标对象(上一个类)
params	//参数对象
returnObj	//返回对象
throwExp	//异常对象
isBefore	
isThrow		//是否有异常抛出
isReturn	//是否有返回值

1、先访问http://localhost/user/0  看到500服务器异常
2、watch com.example.demo.arthas.user.UserController * '{params, throwExp}'  
3、watch com.example.demo.arthas.user.UserController * returnObj 'params[0] < 100'
# 把获取到的结果展开 index 为扩展的层数
-x index

2.热更新代码

1、http://localhost/user/0	会返回500异常
2、jad --source-only com.example.demo.arthas.user.UserController > C:\\Users\\Administrator\\Desktop\\Arthas\\UserController.java
3、修改UserController.java,注释异常代码,返回
4、sc -d *UserController | grep classLoaderHash
5、mc -c 72ea2f77 UserController.java
6、redefine C:\\Users\\Administrator\\Desktop\\Arthas\\com\\example\\demo\\arthas\\user\\UserController.class
7、http://localhost/user/0 	异常消失

3.动态更新应用Logger Level

1、http://localhost/user/12	日志级别已调成debug级,有日志打印
2、sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash
3、ognl -c 72ea2f77 '@com.example.demo.arthas.user.UserController@logger'
4、ognl -c 72ea2f77 '@[email protected](@ch.qos.logback.classic.Level@ERROR)'
5、http://localhost/user/12	日志级别已调成error级,没有日志打印
# 修改日志文件的全局logger level
ognl -c 72ea2f77 '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'

4.获取Spring Context

1、tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
2、tt -i 1000 -w 'target.getApplicationContext()'
3、tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'
4、tt -i 1000 -w 'target.getApplicationContext().getBean("userController").findUserById(2)'
#列出所有ClassLoader
classloader -l
#列出ClassLoader里加载的所有类
classloader -a -c 72ea2f77 > C:\\Users\\Administrator\\Desktop\\Arthas\\loadClassName.txt

命令列表

dashboard 显示当前系统的实时数据面板

截图展示:
Arthas研究笔记(Java诊断工具)_第1张图片

数据说明:
ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应
NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
STATE: 线程的状态
CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。
TIME: 线程运行总时间,数据格式为分:秒
INTERRUPTED: 线程当前的中断位状态
DAEMON: 是否是daemon线程

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

参数名称 参数说明
id 线程id
[n:] 指定最忙的前N个线程并打印堆栈
[b] 找出当前阻塞其他线程的线程
[i ] 指定cpu占比统计的采样间隔,单位为毫秒
thread id	//显示指定线程的运行堆栈
thread -b	//找出当前阻塞其他线程的线程
thread -n 3		//展示当前最忙的前3个线程并打印堆栈
thread -i 1000	//指定采样时间间隔

jvm 查看当前JVM信息

THREAD相关
COUNT: JVM当前活跃的线程数
DAEMON-COUNT: JVM当前活跃的守护线程数
PEAK-COUNT:JVM启动开始曾经活着的最大线程数
STARTED-COUNT:JVM启动开始总共启动过的线程次数
DEADLOCK-COUNT: JVM当前死锁的线程数
文件描述符相关
MAX-FILE-DESCRIPTOR-COUNTJVM进程最大可以打开的文件描述符数
OPEN-FILE-DESCRIPTOR-COUNTJVM当前打开的文件描述符数

sysprop 查看当前JVM的系统属性(System Property)

sysprop java.version	查看单个属性
sysprop user.country CN	修改单个属性

sysenv 查看当前JVM的环境属性(System Environment Variables)

sysenv USER	查看单个环境变量

vmoption 查看,更新VM诊断相关的参数

vmoption PrintGCDetails	查看指定的option
vmoption PrintGCDetails true	更新指定的option

getstatic 查看类的静态属性

getstatic class_name field_name	//使用方式

sc 查看JVM已加载的类信息

sc -d demo.MathGame	//打印类的详细信息
sc -d -f demo.MathGame	//打印出类的Field信息

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

sm java.lang.String	//打印类的所有方法
sm -d java.lang.String toString	//打印方法的详细信息

jad 反编译指定已加载类的源码

jad --source-only demo.MathGame	//反编绎时只显示源代码

classloader 查看类加载信息

classloader -l	//按类加载实例查看统计信息
classloader -c 3d4eac69 --load demo.MathGame	//使用ClassLoader去加载类

mc 编译.java文件生成.class

mc -c 72ea2f77 UserController.java	//编译UserController.java文件成.class文件

redefine 加载外部的.class文件

redefine C:\\Users\\Administrator\\Desktop\\UserController.class	//加载UserController.class文件

monitor 方法执行监控

监控项 说明
timestamp 时间戳
class Java类
method 方法(构造方法、普通方法)
total 调用次数
success 成功次数
fail 失败次数
rt 平均RT
fail-rate 失败率
monitor -c 5 demo.MathGame primeFactors	//健康demo.MathGame类的 primeFactors方法

watch 方法执行数据观测

watch com.example.demo.arthas.user.UserController * '{params, throwExp}'

tt 方法执行数据的时空隧道

tt -t com.example.demo.arthas.user.UserController findUserById //筛选UserController类 findUserById 方法的调用信息
tt -i 1000	//查看调用信息
tt -i 1000 -p	//重做一次调用

cat 打印文件内容

cat C:\\Users\\Administrator\\Desktop\\Arthas\\UserController.java	//和linux里的cat命令类似

pwd 返回当前的工作目录

pwd 	//和linux命令类似

Arthas 基础命令

help——查看命令帮助信息
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
stop——和shutdown命令一致
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas快捷键列表及自定义快捷键

你可能感兴趣的:(Java诊断工具,Java诊断工具)