引言
在 Java 应用的性能调优过程中,理解方法调用路径及其性能开销是至关重要的。Arthas 的 trace
命令提供了一种强大的方法,可以追踪 Java 程序中方法的调用链,并分析每个调用节点的耗时。本文将详细介绍如何使用 Arthas 的 trace
命令来深入分析 Java 方法调用。
trace
命令简介
trace
命令能够主动搜索匹配特定类和方法的调用路径,并统计整个调用链路上的所有性能开销。这对于定位因延迟(RT)高而导致的性能问题非常有用。
参数说明
trace
命令支持以下参数:
_class-pattern_
:类名表达式匹配。_method-pattern_
:方法名表达式匹配。_condition-express_
:条件表达式,主要由 OGNL 表达式构成。-E
:开启正则表达式匹配,默认为通配符匹配。-n
:命令执行次数,默认值为 100。#cost
:方法执行耗时的过滤条件。-m <arg>
:指定 Class 最大匹配数量,默认值为 50。
使用 trace
命令
基本用法
要使用 trace
命令,只需指定要追踪的类和方法:
$ trace demo.MathGame run
这将输出 demo.MathGame
类中 run
方法的调用链路及其每个节点的耗时。
指定 Class 匹配的最大数量
如果需要限制匹配到的类的数量,可以使用 -m
参数:
$ trace demo.MathGame run -m 1
调用耗时过滤
trace
命令支持基于方法执行耗时的过滤,例如:
$ trace demo.MathGame run '#cost > 100'
这将只展示执行时间超过 100ms 的调用路径。
动态追踪
Arthas 3.3.0 版本后,可以使用动态 trace
功能,不断增加新的匹配类。例如,在终端 1 中启动 trace
:
[arthas@59161]$ trace demo.MathGame run
然后在新终端中使用相同 listenerId
进行更深层次的追踪:
[arthas@59161]$ trace demo.MathGame primeFactors --listenerId 1
排除指定类
使用 --exclude-class-pattern
参数可以排除特定的类:
trace javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
注意事项
trace
命令每次只能跟踪一级方法的调用链路。- 使用
trace
命令本身会带来一定的性能开销,因此在统计报告中并未减去其自身的统计开销。 trace
命令不支持java.lang.Thread getName
方法的追踪。
结语
Arthas 的 trace
命令是一个强大的工具,它可以帮助开发者深入理解 Java 应用中的方法调用和性能瓶颈。通过本文的介绍,希望读者能够掌握 trace
命令的使用方法,并将其应用于实际的性能调优工作中。