arthas

1.下载安装

1
2
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
1
2
wget https://arthas.gitee.io/arthas-boot.jar
java -jar arthas-boot.jar --repo-mirror aliyun --use-http

更多下载安装去官网查看。

2.什么是arthas

Arthas 是Alibaba开源的Java诊断工具。

3.arthas能干啥

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

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

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

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

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

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

4.这个类从哪个jar包加载的?

sc 查看JVM已加载的类信息
Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息。
sc *StringUtils

sc -d org.springframework.util.StringUtils
-d 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。
如果一个类被多个ClassLoader所加载,则会出现多次
其中code-source就包含jar包信息

5.排查函数调用异常

官网案例:
curl http://localhost/user/0
{“timestamp”:1550223186170,”status”:500,”error”:”Internal Server Error”,”exception”:”java.lang.IllegalArgumentException”,”message”:”id < 1”,”path”:”/user/0”}
问题1:请求的具体参数,异常栈是什么呢
watch com.example.demo.arthas.user.UserController * ‘{params, throwExp}’

watch 方法执行数据观测
第一个参数是类名,对持通配,com.example.demo.arthas.user.UserController
第二个参数是函数名,支持通配,*
第三个参数是观察表达式,’{params, throwExp}’
params 本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组
throwExp 本次调用抛出的异常。当且仅当 isThrow==true 成立时有效,表明方法调用是以抛出异常的方式结束。
再次访问curl http://localhost/user/0
watch命令会打印调用的参数和异常
这样可以在不打印日志的时候,观察到调用参数和异常栈。

-x
指定输出结果的属性遍历深度,默认为 1

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

jad
反编译指定已加载类的源码
jad –source-only org.springframework.util.StringUtils

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

用watch命令
使用jad反编译出源码,修改源码,编译源码(mc), 加载编译源码(redefine).(arthas在线教程进阶版)
如果是有打印日志,线上关闭了debug、info、warn级别,可以动态改变logger level(arthas在线教程进阶版)

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

dashboard 当前系统的实时数据面板
thread、memory、gc、runtime

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

jvm 查看当前JVM信息


arthas
http://hanqichuan.com/2019/09/27/java/arthas入门/
作者
韩启川
发布于
2019年9月27日
许可协议