trace 命令
trace
命令主要用于监控方法的调用链路以及性能开销。它可以帮助你了解一个方法被调用时,究竟调用了哪些方法,以及每个方法的执行时间。这对于排查性能问题非常有用。
使用场景:
- 想要知道某个方法调用了哪些其他方法。
- 想要知道这些方法的执行时间,包括总时间、最大时间、最小时间等。
基本用法:
代码语言:javascript复制trace <class-pattern> <method-pattern> [options]
例如:
代码语言:javascript复制trace com.example.MyClass myMethod
watch 命令
watch
命令则更侧重于观察方法的具体调用情况,包括方法的入参、返回值、抛出的异常等。它可以用来监控方法的执行数据,并且可以指定观察的表达式,从而获取你感兴趣的具体信息。
使用场景:
- 想要知道方法调用时的具体参数是什么。
- 想要知道方法的返回值或者抛出的异常。
- 想要在方法执行前后监控特定变量的值。
基本用法:
代码语言:javascript复制watch <class-pattern> <method-pattern> <expression> [options]
例如:
代码语言:javascript复制watch com.example.MyClass myMethod '{params, returnObj}'
trace 与 watch 的区别
- 监控深度:
trace
用于监控方法调用的深度,包括调用了哪些方法以及每个方法的执行时间;而watch
用于监控方法的具体执行细节,如参数、返回值等。 - 用途:
trace
更适合于排查性能问题,通过观察方法的调用链路和耗时来定位可能的性能瓶颈;watch
更适合于排查逻辑问题,通过观察方法的执行状态来理解程序的行为。 - 输出信息:
trace
输出的是方法调用的堆栈信息和时间消耗;watch
输出的是用户指定表达式的值,可以是参数、返回值、异常等。
在实际使用中,根据问题的具体情况选择合适的命令是非常重要的。有时候,两者也可以结合使用,比如先用 trace
定位到有问题的方法调用,然后再用 watch
来深入观察该方法的具体执行状态。
trace案例截图:
watch案例截图: