trace命令作用
输出方法路径上的每个节点上耗时。每次只能跟踪一级方法的调用链路。
1、trace demo.MathGame run
作用是持续打印出来,调用该方法的链路以及每步执行时间。
结果里的 #24
,表示在run函数里,在源文件的第24
行调用了primeFactors()
函数。
[0.409579ms]表示该primeFactors
方法执行的用时。
[2.069657ms]表示run方法执行的总用时。
找到耗时比较长的步骤进行优化
下图为通过jad demo.MathGame反编译类后的代码
2、如果生产该接口并发访问量比较大,可以使用如下命令进行次数限制输出
trace demo.MathGame run -n 1
表示输出一次方法trace
3、默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置--skipJDKMethod false
。
trace --skipJDKMethod false demo.MathGame run
4、调用耗时过滤
trace demo.MathGame run '#cost > 2'
此时只会过滤出来调用run方法总用时大于2ms的记录trace
-
[0,0,0ms,11]xxx:yyy() [throws Exception],对该方法中相同的方法调用进行了合并,
0,0,0ms,11
表示方法调用耗时,min,max,total,count
; -
throws Exception
表明该方法调用中存在异常返回,即该方法执行在此位置时抛出了异常。
5、可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果
trace命令只会trace匹配到的函数里的子调用,并不会向下trace多层。因为trace是代价比较贵的,多层trace可能会导致最终要trace的类和函数非常多。
可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果。
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
使用 --exclude-class-pattern
参数可以排除掉指定的类,比如:
trace javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
接口性能调优案例
https://github.com/alibaba/arthas/issues/1892
官方命令参考