Arthas使用笔记

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 [类名] [方法名]

示例

  1. tt -t *Test print params.length==1
  2. tt -t *Test print 'params[1] instanceof Integer'
  3. tt -t *Test print params[0].mobile=="13989838402"

高级用法

  1. 检查调用上下文
    tt -i
  2. 记录回放
    tt -i -p

注意:

  1. ThreadLocal缺失
  2. 参数已变更

7、仪表盘:dashboard

系统实时统计面板,默认每5秒刷新一次
Thread
Memory
Runtime

8、线程:thread

  1. thread :查看指定线程情况
  2. thread -n :查看前N个最忙线程
  3. thread -b 定位阻塞线程
  4. thread -i :指定取样间隔
  5. thread --state WAITING|BLOCKED|... :根据状态查看线程

9、查看JVM:jvm

10、查看系统属性:sysprop

11、查看JVM环境变量:sysenv

12、日志:logger

  1. 查看系统logger配置
  2. 修改logger等级:logger --name ROOT --level debug

实例:

1、监控方法参数

watch class全限定名称 方法名 "{params,returnObj}"
可增加筛选 'params[0]=="abc"'

2、线上代码增加打印日志
1)反编译:jad --source-only [class全限定名称] > [存放目录][class名称].java
2)修改代码并保存
3)找出classloader:sc -d *[class名称] | grep classLoader
4)编译文件:mc -c [classloader ID] [存放目录][class名称].java -d [存放目录]
5)重新加载类:redefine [存放目录][编译后class]

你可能感兴趣的:(Arthas使用笔记)