Arthas使用笔记
1、监控方法:watch
1)-b 在方法调用前监控,默认false
2)-e 当方法发生异常 ,默认false
3)-s 当方法正常退出 ,默认false
4)-f 当方法退出(包含异常和正常退出),默认true
5)-x [N] 打印属性的深度,默认1(数值越大看到越详细属性数据)
使用条件表达式
watch [类名] [方法名] "{params,target}" "params[0]<0"
watch [类名] [方法名] "{params,target}" 'params[0]=="test"'
检查异常
watch [类名] [方法名] "{params,throwExp}" -e -x 3
根据耗时过滤(单位毫秒)
watch [类名] [方法名] "{params,returnObj}" '#cost>200' -x 3
watch 指定类
watch [类名] [方法名] 'target' // target代表this对象
watch 指定类属性
watch [类名] [方法名] 'target.field_name' // target.field_name代表this对象的属性
2、跟踪方法调用栈及调用时间:trace
跟踪次数限制(接收到结果后退出)
trace [类名] [方法名] -n 1
过滤JDK方法,是否过滤jdk方法,默认true
trace --skipJDKMethod true|false [类名] [方法名]
根据耗时过滤
trace [类名] [方法名] '#cost > 200'
3、反编译类:jad
1)jad 类名称
2)jad --source-only 类名称
3)jad 类名称 方法
4、查找JVM已加载的类:sc
1)sc demo.* 默认打印类名称
2)sc -d 指定类 打印类细节,包括code-source,类specification和类加载器等
5、重新加载类:redefine
加载的类不能修改,增加或删除类的field和方法(包括参数,方法名和返回类型)
如果mc失败,可以在本地编译,然后上载到服务器重新加载
目前redefine和watch/trace/jad/tt冲突,以后将解决这个问题
6、监控方法:tt
以滚动形式(类似top)监控方法的调用情况,包含调用时间,耗时,是否正常返回,是否异常等
tt -t [类名] [方法名]
示例
- tt -t *Test print params.length==1
- tt -t *Test print 'params[1] instanceof Integer'
- tt -t *Test print params[0].mobile=="13989838402"
高级用法
- 检查调用上下文
tt -i <index> - 记录回放
tt -i <index> -p
注意:
- ThreadLocal缺失
- 参数已变更
7、仪表盘:dashboard
系统实时统计面板,默认每5秒刷新一次
Thread
Memory
Runtime
8、线程:thread
- thread <id>:查看指定线程情况
- thread -n <N>:查看前N个最忙线程
- thread -b 定位阻塞线程
- thread -i <N>:指定取样间隔
- thread --state WAITING|BLOCKED|... :根据状态查看线程
9、查看JVM:jvm
10、查看系统属性:sysprop
11、查看JVM环境变量:sysenv
12、日志:logger
- 查看系统logger配置
- 修改logger等级:logger --name ROOT --level debug
实例:
1、监控方法参数
watch class全限定名称 方法名 "{params,returnObj}"
可增加筛选 'params[0]=="abc"'