Arthas干货总结
1 watch
watch com.suning.rdrs.admin.controller.RdrsDataCloudController obtainTargetFieldInfo '{params, throwExp}' -x 2
格式:全限定名 + 空格 + 方法名 + 空格 + 固定写法 + -x 2
是为了将结果展开
返回值表达式实际是一个 ognl
表示,支持一些内置对象:
- loader
- clazz
- method
- target
- params
- returnObj
- throwExp
- isBefore
- isThrow
- isReturn
watch命令支持按请求耗时进行过滤:
watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'
Arthas在 watch/trace 等命令时,实际上是修改了应用的字节码,插入增强的代码。显式执行 reset 命令,可以清除掉这些增强代码
2 jvm
jvm
命令可以打印 JVM
的各种信息 重点信息
我们控制台系统的信息
THREAD
-------------------------------------------------------------------------------------------------------
COUNT 264
DAEMON-COUNT 124
PEAK-COUNT 275
STARTED-COUNT 3184
DEADLOCK-COUNT 0
COUNT
: JVM 当前活跃的线程数DAEMON-COUNT
: JVM 当前活跃的守护线程数PEAK-COUNT
: 从J VM 启动开始曾经活着的最大线程数STARTED-COUNT
: 从 JVM 启动开始总共启动过的线程次数DEADLOCK-COUNT
: JVM 当前死锁的线程数
3 ognl
ognl '@demo.MathGame@random'
4 trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
$ trace demo.MathGame run Press Ctrl+C to abort. Affect(class-cnt:1 , method-cnt:1) cost in 42 ms. `---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 `---[10.611029ms] demo.MathGame:run() +---[0.05638ms] java.util.Random:nextInt() +---[10.036885ms] demo.MathGame:primeFactors() `---[0.170316ms] demo.MathGame:print()
5 stack
输出当前方法被调用的调用路径
很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
$ stack demo.MathGame primeFactors '#cost>5' Press Ctrl+C to abort. Affect(class-cnt:1 , method-cnt:1) cost in 35 ms. ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
thread
thread 线程号
打印线程栈,这个可比jstack方便多了吧