这个类从哪个 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/
支持的内置对象:
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
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 异常消失
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)'
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
数据说明:
ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应
NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
STATE: 线程的状态
CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。
TIME: 线程运行总时间,数据格式为分:秒
INTERRUPTED: 线程当前的中断位状态
DAEMON: 是否是daemon线程
参数名称 | 参数说明 |
---|---|
id | 线程id |
[n:] | 指定最忙的前N个线程并打印堆栈 |
[b] | 找出当前阻塞其他线程的线程 |
[i ] | 指定cpu占比统计的采样间隔,单位为毫秒 |
thread id //显示指定线程的运行堆栈
thread -b //找出当前阻塞其他线程的线程
thread -n 3 //展示当前最忙的前3个线程并打印堆栈
thread -i 1000 //指定采样时间间隔
THREAD相关
COUNT: JVM当前活跃的线程数
DAEMON-COUNT: JVM当前活跃的守护线程数
PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数
STARTED-COUNT: 从JVM启动开始总共启动过的线程次数
DEADLOCK-COUNT: JVM当前死锁的线程数
文件描述符相关
MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数
OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数
sysprop java.version 查看单个属性
sysprop user.country CN 修改单个属性
sysenv USER 查看单个环境变量
vmoption PrintGCDetails 查看指定的option
vmoption PrintGCDetails true 更新指定的option
getstatic class_name field_name //使用方式
sc -d demo.MathGame //打印类的详细信息
sc -d -f demo.MathGame //打印出类的Field信息
sm java.lang.String //打印类的所有方法
sm -d java.lang.String toString //打印方法的详细信息
jad --source-only demo.MathGame //反编绎时只显示源代码
classloader -l //按类加载实例查看统计信息
classloader -c 3d4eac69 --load demo.MathGame //使用ClassLoader去加载类
mc -c 72ea2f77 UserController.java //编译UserController.java文件成.class文件
redefine C:\\Users\\Administrator\\Desktop\\UserController.class //加载UserController.class文件
监控项 | 说明 |
---|---|
timestamp | 时间戳 |
class | Java类 |
method | 方法(构造方法、普通方法) |
total | 调用次数 |
success | 成功次数 |
fail | 失败次数 |
rt | 平均RT |
fail-rate | 失败率 |
monitor -c 5 demo.MathGame primeFactors //健康demo.MathGame类的 primeFactors方法
watch com.example.demo.arthas.user.UserController * '{params, throwExp}'
tt -t com.example.demo.arthas.user.UserController findUserById //筛选UserController类 findUserById 方法的调用信息
tt -i 1000 //查看调用信息
tt -i 1000 -p //重做一次调用
cat C:\\Users\\Administrator\\Desktop\\Arthas\\UserController.java //和linux里的cat命令类似
pwd //和linux命令类似
help——查看命令帮助信息
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
stop——和shutdown命令一致
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas快捷键列表及自定义快捷键