文章目录

  • 下载并启动arthas
  • 1 JVM相关命令
    • 1.1 dashboard实时数据面板
    • 1.2 thread查询线程信息
    • 1.3 jvm查询当前jvm信息
    • 1.4 vmoption调整VM诊断参数
    • 1.5 logger查看与修改日志信息
    • 1.6 heapdump堆快照
    • 1.7 vmtool查询内存对象(方便排查大对象)
    • 1.8 getstatic查看类的静态属性
  • 2 class文件相关命令(代码热更新)
    • 2.1 jad反编译指定类的源码
    • 2.2 查找加载的 ClassLoader
    • 2.3 mc生成字节码文件
    • 2.4 retransform加载字节码文件
    • 2.5 sc/sm查看已加载的类和方法信息
  • 3 字节码增强相关命令
    • 3.1 monitor监控方法执行
    • 3.2 watch方法执行数据观测
      • 3.2.1 当异常时打印参数与堆栈信息
      • 3.2.2 按照耗时进行过滤
    • 3.3 trace统计方法的调用链路
    • 3.4 stack指定方法触发的路径
    • 3.5 tt记录每次方法调用现场(很强大)
    • 3.6 profiler生成火焰图

官方文档链接:https://arthas.aliyun/doc/index.html

下载并启动arthas

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

java -jar arthas-boot.jar

1 JVM相关命令

1.1 dashboard实时数据面板

dashboard:查看当前系统实时数据面板

dashboard -i 5000 -n 5 // -i指刷新时间间隔,-n指刷新次数

面板信息标注:

1.2 thread查询线程信息

  1. thread: 查看当前线程信息,没有堆栈;
  2. thread id: 展示指定线程的堆栈信息;
  3. thread -n 3: 展示最忙的前三个线程并打印堆栈信息;
  4. thread -b: 找出synchronized关键字阻塞住的线程;

1.3 jvm查询当前jvm信息

其中线程相关信息:

1.4 vmoption调整VM诊断参数

vmoption:查看所有VM相关参数状态;
vmoption PrintGCDetails true: 修改VM指定参数;
其中需要关注的参数如下:

  1. HeapDumpBeforeFullGC:实现FullGC前dump;
  2. HeapDumpAfterFullGC:实现FullGC后dump;
  3. HeapDumpOnOutOfMemoryError:内存溢出时dump;
  4. HeapDumpPath:dump文件路径,必须是存在的路径;
  5. PrintGCDetails:打印GC日志,包含堆内存各区域使用情况;
  6. PrintGCDateStamps: 输出GC的时间戳;

注意:开启打印GC日志时必须是已经配置了loggc路径,不然不生效

1.5 logger查看与修改日志信息

logger -n FLOW_INFO_LOG -level debug // FLOW_INFO_LOG日志级别改为debug

1.6 heapdump堆快照

heapdump --live /tmp/dump.hprof // 只打印存活对象

1.7 vmtool查询内存对象(方便排查大对象)

vmtool --action getInstances --className *.PublishInfoLabelJob -x 2

1.8 getstatic查看类的静态属性

getstatic *.ConnectionPropertiesImpl PROPERTY_LIST

2 class文件相关命令(代码热更新)

2.1 jad反编译指定类的源码

jad --source-only com.bj58.che.yxp.buyerservice.utils.JacksonUtil > /tmp/JacksonUtil.java

注意:需要新建一个窗口,编辑反编译后的文件(arthas进程不支持vim命令)!

2.2 查找加载的 ClassLoader

sc -d *JacksonUtil | grep classLoaderHash

不指定加载器生成字节码时有时会报:cannot find symbol

2.3 mc生成字节码文件

mc -c 4e428222 /tmp/JacksonUtil.java -d /tmp

2.4 retransform加载字节码文件

retransform /tmp/com/bj58/che/yxp/buyerservice/utils/JacksonUtil.class

2.5 sc/sm查看已加载的类和方法信息

sc:查看所有已加载到的类,如果是接口还可以搜索所有实现类
sm:查找类的具体函数

sc javax.servlet.Filter
sc -d javax.servlet.Filter // -d可以打印出类加载具体信息
sc *StringUtils // 支持通配符
sm -d *.RoundingMode

3 字节码增强相关命令

3.1 monitor监控方法执行

monitor 类名 方法名:监控方法的调用结果。

monitor *JacksonUtil toJsonString -c 5 "param[0] != null"

3.2 watch方法执行数据观测

watch *JacksonUtil toJsonString '{params, returnObj, throwExp}' -x 2 
// 第一个参数是类名,第二个参数是函数名,都支持通配符,-x 2可以按指定层级展示结果

3.2.1 当异常时打印参数与堆栈信息

watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e

3.2.2 按照耗时进行过滤

watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'

3.3 trace统计方法的调用链路

trace *AuctionFeeProcessor calDeliverFee

3.4 stack指定方法触发的路径

stack *AuctionFeeProcessor calDeliverFee

3.5 tt记录每次方法调用现场(很强大)

  1. 记录指定类下某些满足条件方法的调用现场:
tt -t -n 5 *AuctionFeeProcessor * '#cost>=1'

  1. 查看当前的调用记录:
tt -l 
  1. 检索想要的记录:
tt -s 'method.name=="calTradeAndDeliverFee"'
  1. 查看某个记录的调用信息,包括传参与返回结果:
tt -i 1195
  1. 重新发起调用
tt -i 1195 -p

3.6 profiler生成火焰图

启动(参数可以不加): profiler start --duration 300  --include '*/b2b/*' --exclude '*apollo*' 
查看状态:profiler status
停止:profiler stop
恢复采样:profiler resume

更多推荐

arthas常用命令整理