入门文档:trace | arthas
1、jar下载和启动
连接curl -O https://arthas.aliyun.com/arthas-boot.jar【wget https://arthas.aliyun.com/arthas-boot.jar】
。.../jdk/bin/java -jar arthas-boot.jar 22336【最好在这个目录启动,port可选】
选择进程序号 enter回车:
可能 报错The telnet port 3658 is used by process 22336 instead of target process 20736, you will connect to an unexpected process 说明上次的连接还在挂着,没有exit或者stop,需要先进入,再stop;
最后重启arthas-boot.jar 选择程序
演示:
2、trace 查找时间运行过长 或者某个方法运行的情况
基本用法:
trace class-pattern method-pattern [condition-express]
参数说明:
class-pattern: 类名表达式匹配
method-pattern: 方法名表达式匹配
condition-express: 条件表达式,ognl语法
-E: 正则匹配
-n: 执行次数,例如 -n 2
例子:
1.trace函数指定类的方法
trace MathGame run
2.默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置--skipJDKMethod false.
trace --skipJDKMethod false MathGame run
3.根据耗时过滤,trace大于100ms的调用路径
trace MathGame run '#cost > 100'
4.可以所使用的正则匹配路径上的多个类和函数,一定程度上达到多层trace的效果。
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
演示:
3、watch语法排查
基本语法,[]表示可选:
watch class-pattern method-pattern express [condition-express]
参数说明:
class-pattern: 类名表达式匹配
method-pattern: 方法名表达式匹配
express: 观察表达式,ognl语法
condition-express: 条件表达式,ognl语法
-b: 在方法调用前观察,before
-e: 在方法异常后观察,exception
-s: 在方法返回之后观察, success
-f: 在方法结束之后观察(正常返回和异常返回),finish
-n: watch xxx... -n 2,表示只执行两次
-E: 开启正则匹配
-x: 结果属性遍历深度,默认为-x 1。例如,一个对象里的属性为List<Integer>,当深度为1时,我们只能看到对象里有一个List的属性,看不到List里保存的具体的值,当深度为2时就可以看到了
特别说明:
1.-b,-e,-s默认关闭,-f默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
2.这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了-b事件点params代表方法入参外,其余事件都代表方法出参
3.当使用-b时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
例子:
1.观察MathGame类中primeFactors方法的返回值,遍历深度为2
watch MathGame primeFactors "{params, returnObj}" -x 2
2.观察MathGame类中primeFactors方法的入参,深度为2
watch MathGame primeFactors "{params, returnObj}" -x 2 -b
3. 观察当前对象中的所有属性,在函数执行前
watch MathGame primeFactors "target" -x 2 -b
4.观察对象中某一个属性,在函数执行前,target指当前对象
watch MathGame primeFactors "target.属性名" -x 2 -b
5.同时观察方法调用前和方法返回后,参数里-n 2,表示只执行两次
watch MathGame primeFactors "{params, target, returnObj}" -x 2 -b -s -n 2
6.通过条件表达式,输出第一参数小于0的情况
watch MathGame primeFactors "{params[0], target}" "params[0]<0"
演示:
4、stack
很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法时从哪里被执行了,此时需要的是stack命令
基本用法:
stack class-pattern method-pattern [condition-express]
参数说明:
class-pattern: 类名表达式匹配
method-pattern: 方法名表达式匹配
condition-express: 条件表达式,ognl语法
-E: 正则匹配
-n: 执行次数,例如 -n 2
例子:
1.查看MathGame类,primeFactors方法被执行的路径
stack MathGame primeFactors
2.条件表达式来过滤,第0个参数的值小于0
stack MathGame primeFactors 'params[0]<0'
3.根据执行时间进行过滤,赛选出执行时间超过100ms的
stack MathGame primeFactors '#cost > 100'
演示:
5 dashboard--cpu过高分析