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

在这里插入图片描述

二、命令列表

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.Arthas 全攻略:让调试变得简单
2.Arthas dashboard(当前系统的实时数据面板)
3.Arthas thread(查看当前JVM的线程堆栈信息)
4.Arthas jvm(查看当前JVM的信息)
5.Arthas sysprop(查看和修改JVM的系统属性)
6.Arthas sysenv(查看JVM的环境变量)
7.Arthas vmoption(查看和修改 JVM里诊断相关的option)
8.Arthas getstatic(查看类的静态属性 )
9.Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
10.Arthas logger(查看 logger 信息,更新 logger level)
11.Arthas mbean(查看 Mbean 的信息)
12.Arthas memory(查看 JVM 内存信息)
13.Arthas ognl(执行ognl表达式)
14.Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)
15.Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
16.Arthas jad(字节码文件反编译成源代码 )
17.Arthas mc(Memory Compiler/内存编译器 )
18.Arthas redefine(加载外部的.class文件,redefine到JVM里 )
19.Arthas classloader (查看 classloader 的继承树,urls,类加载信息)
20.Arthas sc(查看JVM已加载的类信息 )
21.Arthas sm(查看已加载类的方法信息 )
22.Arthas monitor(方法执行监控)
23.Arthas stack (输出当前方法被调用的调用路径)
24.Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)
25.Arthas tt(方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测)
26.Arthas watch (方法执行数据观测)
27.Arthas profiler(使用async-profiler对应用采样,生成火焰图)

<think>好的,我现在需要回答用户关于如何使用Arthas命令来查看方法调用耗时的问题。首先,我要回忆一下Arthas的相关命令,特别是和性能分析相关的。记得用户提到过trace命令,这可能和耗时有关。根据引用内容,用户提供的参考里有提到trace命令可以对方法内部调用路径进行追踪,输出每个节点耗时,所以这应该是关键。 接下来,我需要确认trace命令的具体用法。用户提供的引用[3]中,Arthas教程里明确提到trace用于追踪方法内部调用路径耗时。此外,用户可能还需要知道如何安装和启动Arthas,因为问题中提到了使用教程。根据引用[3]的安装步骤,下载arthas-boot.jar用java命令启动是正确的步骤。 然后,我需要组织步骤,确保用户能够一步步跟随。首先安装Arthas,然后启动,选择目标进程,接着使用trace命令。可能还需要解释命令的参数,比如类名、方法名,以及如何过滤特定的调用路径。例如,trace com.example.TestService getInfo -n 5 --skipJDKMethod false,这里需要说明每个参数的作用,比如-n是执行次数限制,--skipJDKMethod是否跳过JDK方法。 另外,用户可能想知道如何查看更详细的结果或调整参数,比如时间统计的单位,或者排除某些类。这时候可能需要提到Arthas的其他选项,比如--list-classes或调整日志级别,但根据引用内容,这些可能不在现有引用里,所以可能需要只基于提供的引用信息来回答。 还要考虑用户可能遇到的常见问题,比如如何确定类名和方法名是否正确,这时候可以使用sc命令(search class)来查找类,或者sm命令(search method)查找方法,但根据引用[3],classloader和dump命令可能相关,但用户问题主要关于耗时,所以重点在trace。 最后,需要提醒用户注意事项,比如生产环境中谨慎使用,避免性能影响,以及正确退出Arthas方法。这些内容在引用中没有提到,但属于常见的最佳实践,可以适当补充,但根据系统级指令,回答应基于提供的引用。因此,可能只提到引用中的内容,比如使用options全局开关(引用[3]中的options命令)来调整设置。 总结步骤:安装Arthas,启动,附加到进程,使用trace命令指定类和方法,解释参数,示例,高级用法如过滤和统计次数,注意事项。确保引用相关的部分正确标注,比如trace命令的解释来自引用[3]。</think>以下是如何使用Arthas命令查看方法调用耗时的详细教程,结合核心命令和操作步骤进行说明: --- ### 一、安装与启动Arthas 1. 下载启动Arthas(需Java环境): ```bash wget https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar ``` 2. 选择目标Java进程编号,按回车附加到进程[^3]。 --- ### 二、使用`trace`命令追踪方法耗时 **命令格式**: ```bash trace [全限定类名] [方法名] [参数过滤条件] [其他选项] ``` **示例**: ```bash trace com.example.TestService getInfo -n 5 --skipJDKMethod false ``` - `-n 5`: 仅统计最近5次调用结果 - `--skipJDKMethod false`: 包含JDK内置方法耗时统计[^3] **输出解读**: ``` `---ts=2023-10-01 12:00:00;thread_name=main;id=1;is_daemon=false;priority=5; `---[5.23ms] com.example.TestService:getInfo() +---[1.02ms] com.example.Dao:queryData() `---[3.21ms] com.example.Util:process() ``` - `ts`: 调用时间戳 - `thread_name`: 线程名 - 层级缩进表示调用链关系 - `[5.23ms]`: 总耗时(包含子调用) - `+---`/`---`: 子方法调用耗时 --- ### 三、高级用法 1. **按耗时阈值过滤**: ```bash trace com.example.*Service *CostlyMethod '#cost > 10' ``` 仅显示耗时超过10ms的调用。 2. **追踪异常路径**: ```bash trace com.example.Service errorMethod -e ``` `-e`选项会额外输出异常堆栈。 3. **结合`stack`命令定位调用来源**: 先通过`stack`命令找到调用路径[^2],再用`trace`分析具体耗时。 --- ### 四、注意事项 1. **性能影响**:高频方法(如每秒万次调用)使用`trace`可能导致性能下降,建议通过`-n`限制采样次数。 2. **精确类名**:可通过`sc`命令查询类名,如`sc *TestService*`。 3. **退出Arthas**:输入`stop`或`quit`退出监控。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘大猫.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值