arthas
1.下载安装
1 |
|
1 |
|
更多下载安装去官网查看。
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信息