Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)

wan123 10小时前 阅读数 5492 #在线测试

@[toc]

二、命令列表

2.3 monitor/watch/trace/stack/tt 相关

2.3.3 trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)

使用场景

trace 命令在 Arthas 中用于跟踪方法的执行过程,能够详细记录方法调用的时间、参数、返回值等信息。它的主要使用场景包括:

  1. 性能分析:帮助识别方法调用的耗时,找出性能瓶颈。
  2. 调试:追踪方法的执行路径,了解方法内部的逻辑流动。
  3. 问题定位:快速捕获异常信息,了解异常发生的上下文。

通过 trace 命令,开发者可以获得深入的执行信息,从而更有效地优化和调试应用程序。

提示

方法内部调用路径,并输出方法路径上的每个节点上耗时

watch/stack/trace 这个三个命令都支持#cost

trace 命令能主动搜索 class-patternmethod-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

参数说明

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
condition-express 条件表达式
[E] 开启正则表达式匹配,默认为通配符匹配
[n:] 命令执行次数,默认值为 100。
#cost 方法执行耗时
[m <arg>] 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch <arg>]

这里重点要说明的是条件表达式条件表达式的构成主要由 ognl 表达式组成,所以你可以这样写"params[0]<0",只要是一个合法的 ognl 表达式,都能被正常支持。

很多时候我们只想看到某个方法的 rt 大于某个时间之后的 trace 结果,现在 Arthas 可以按照方法执行的耗时来进行过滤了,例如trace *StringUtils isBlank '#cost>100'表示当执行时间超过 100ms 的时候,才会输出 trace 的结果。

注意事项

  • trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。
  • 3.3.0 版本后,可以使用动态 Trace 功能,不断增加新的匹配类
  • 目前不支持 trace java.lang.Thread getName ,考虑到不是非常必要场景,且修复有一定难度,因此当前暂不修

举例1:查看方法整体耗时

基础语法

trace 全路径类名 方法名

$ trace demo.MathGame run
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 28 ms.
`---ts=2019-12-04 00:45:08;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 `---[0.617465ms] demo.MathGame:run()
        `---[0.078946ms] demo.MathGame:primeFactors() #24 [throws Exception] `---ts=2019-12-04 00:45:09;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
    `---[1.276874ms] demo.MathGame:run() `---[0.03752ms] demo.MathGame:primeFactors() #24 [throws Exception]

提示

结果里的 #24,表示在 run 函数里,在源文件的第24行调用了primeFactors()函数。

举例2:trace次数限制

如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。比如下面的例子里,捕捉到一次调用就退出命令。

基础语法

trace 全路径类名 方法名 -n 次数

$ trace demo.MathGame run -n 1
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 20 ms.
`---ts=2019-12-04 00:45:53;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 `---[0.549379ms] demo.MathGame:run()
        +---[0.059839ms] demo.MathGame:primeFactors() #24
        `---[0.232887ms] demo.MathGame:print() #25

Command execution times exceed limit: 1, so command will exit. You can set it with -n option.

本人其他相关文章链接

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.

  • 随机文章
  • 热门文章
  • 热评文章
热门