查看方法调用耗时trace
trace 包名 类名 方法名 例:trace com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl batchQuerySku
查看线上反编译代码jad
jad 包名 类名 例:jad com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl
查看函数的参数/返回值/异常信息:watch
1)打印方法耗时大于10ms的入参:watch 包名 类名 方法名 "{params}" '#cost > 10' -x 3
例:watch com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl batchQuerySku "{params}" '#cost > 10' -x 3
2)查看返回值:watch 包名 类名 方法名 returnObj
例:watch com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl batchQuerySku returnObj 返回值:
代码语言:javascript复制
Affect(class-cnt:1 , method-cnt:1) cost in 209 ms.
ts=2020-05-18 15:50:47; [cost=27.478658ms] result=@AjaxResult[
log=@Log4jLogger[org.apache.logging.slf4j.Log4jLogger@49246ef6],
code=@String[0],
msg=@String[success],
data=@HashMap[isEmpty=false;size=1],
]
3)观察方法调用前和方法返回后
watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出 [b] 在方法调用之前观察 [e] 在方法异常之后观察 [s] 在方法返回之后观察 [f] 在方法结束之后(正常返回和异常返回)观察 [E] 开启正则表达式匹配,默认为通配符匹配 [n] 表示执行次数 [x:]表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是1 target关键字,查看方法运行前后,当前对象中的属性,target.field_name访问当前对象的某个属性 参数-n 2,表示执行两次,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果 "#cost>200"(单位是ms)表示只有当耗时大于200ms时才会输出,过滤掉执行时间小于200ms的调用 例:watch com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl batchQuerySku "{params,target,returnObj}" -x 2 -b -s -n 2 返回值:
代码语言:javascript复制ts=2020-05-18 18:36:42; [cost=0.024147ms] result=@ArrayList[
@Object[][
@ArrayList[isEmpty=false;size=1],
],
@WelfareGoodsServiceImpl[
WELFARE_BATCH_LIMIT=@Integer[100],
WELFARE_LARGE_LIMIT=@Integer[1000],
],
null,
]
ts=2020-05-18 18:36:42; [cost=1.418077040340744E9ms] result=@ArrayList[
@Object[][
@ArrayList[isEmpty=false;size=1],
],
@WelfareGoodsServiceImpl[
WELFARE_BATCH_LIMIT=@Integer[100],
WELFARE_LARGE_LIMIT=@Integer[1000],
],
@AjaxResult[
log=@Log4jLogger[org.apache.logging.slf4j.Log4jLogger@49246ef6],
code=@String[0],
msg=@String[success],
data=@HashMap[isEmpty=false;size=1],
],
]
方法执行数据的时空隧道:tt
记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测 -t 记录下类 *Test 的 print 方法的每次执行情况。 -n 3 指定你需要记录的次数 返回字段 字段解释 INDEX 时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。 TIMESTAMP 方法执行的本机时间,记录了这个时间片段所发生的本机时间 COST(ms) 方法执行的耗时 IS-RET 方法是否以正常返回的形式结束 IS-EXP 方法是否以抛异常的形式结束 OBJECT 执行对象的hashCode(),注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体 CLASS 执行的类名 METHOD 执行的方法名 例: tt -t -n 1 com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl batchQuerySku 返回值: INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD ------------------------------------------------------- 1000 2020-05-18 18:54:55 22.80519 true false 0x6ba08a09 WelfareGoodsServiceImpl batchQuerySku
查看调用信息:tt -i INDEX编号
代码语言:javascript复制
例:tt -i 1001
返回值:
INDEX 1001
GMT-CREATE 2020-05-18 18:59:56
COST(ms) 12.75646
OBJECT 0x6ba08a09
CLASS com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl
METHOD batchQuerySku
IS-RETURN true
IS-EXCEPTION false
PARAMETERS[0] @ArrayList[
@String[48131552315576321],
]
RETURN-OBJ @AjaxResult[
log=@Log4jLogger[org.apache.logging.slf4j.Log4jLogger@49246ef6],
code=@String[0],
msg=@String[success],
data=@HashMap[isEmpty=false;size=1],
]
输出当前方法被调用的调用路径:stack
代码语言:javascript复制监控数据
1)dashboard数据
输入dashboard,会实时展示当前tomcat的多线程状态、Jvm各区域、GC情况等信息
2)线程监控
输入thread会显示所有线程的状态信息
输入thread -n 3会显示当前最忙的3个线程,可以用来排查线程CPU消耗
输入thread -b 会显示当前处于BLOCKED状态的线程,可以排查线程锁的问题
3)jvm监控
jvm 命令会打印出JVM的各种详细信息
4)monitor方法执行监控
monitor 间隔时间[-c <value>] [-h] 执行时间[-n <value>] [-E <value>] 包名 类名 方法名。运行后方法需要被调用才会触发显示。
例:monitor -c 5 com.aspirecn.amall.goods.openapi.service.impl.WelfareGoodsServiceImpl batchQuerySku
返回值:
timestamp 时间戳
class Java类
method 方法(构造方法、普通方法)
total 调用次数
success 成功次数
fail 失败次数
rt 平均RT
fail-rate 失败率
avg-rt(ms) 平均响应时间(毫秒)
退出Arthas
1)退出当前session:exit/quit 2)完全退出Arthas:shutdown
https://github.com/alibaba/arthas/issues/71