1.Arthas的安装和基础使用

  1. # 1.Arthas的下载安装(推荐)
  2. curl -O https://arthas.aliyun.com/arthas-boot.jar
  3. java -jar arthas-boot.jar
  4. # 2. as.sh安装
  5. curl -L https://arthas.aliyun.com/install.sh | sh
  6. ./as.sh

Dashboard(实时数据面板): 参数

[-i 1000]: 数据刷新间隔(ms),默认5000

[-n 3]: 数据刷新次数 数据

  • ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID 一一对应
  • NAME: 线程名
  • GROUP: 线程组名
  • PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
  • STATE: 线程的状态
  • CPU%: 线程的cpu使用率。比如采样间隔1000ms,某个线程的增量cpu时间为100ms,则cpu使用率=100/1000=10%
  • DELTA_TIME: 上次采样之后线程运行增量CPU时间,数据格式为秒
  • TIME: 线程运行总CPU时间,数据格式为分:秒
  • INTERRUPTED: 线程当前的中断位状态
  • DAEMON: 是否是daemon线程

thread(线程信息): 参数

[id]: 线程ID

[-n 3]: 指定最忙的前N个线程并打印堆栈

[-b]: 找出当前阻塞其他线程的线程

[-i 2000]: 指定cpu使用率统计的采样间隔(ms),默认200

[-all]: 显示所有匹配线程

[-state WAITING]: 查看指定状态的线程

JVM(JVM信息): 数据

  • COUNT: JVM当前活跃的线程数
  • DAEMON-COUNT: JVM当前活跃的守护线程数
  • PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数
  • STARTED-COUNT: 从JVM启动开始总共启动过的线程次数
  • DEADLOCK-COUNT: JVM当前死锁的线程数
  • MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数
  • OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数

sc(查看JVM加载的类): 参数 class-pattern: 类名表达式匹配

[-d]: 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,则会出现多次

[-f]: 输出当前类的成员变量信息(需要配合参数-d一起使用)

   [-E]: 开启正则表达式匹配,默认为通配符匹配

[-x 0]: 指定输出静态变量时属性的遍历深度,默认为0,即直接使用toString输出

jad(反编译指定已加载的源码): 参数 class-pattern: 类名表达式匹配

  • [method-pattern]: 指定函数
  • [-source-only]: 只显示源码

sm(查看JVM已加载的方法信息): 参数 class-pattern: 类名表达式匹配

[-d]: 展示每个方法的详细信息

watch(方法执行数据观测): 参数

  • class-pattern: 类名表达式匹配
  • method-pattern: 方法名表达式匹配
  • express: 观察表达式
  • [condition-express]: 条件表达式
  • [-b]: 在方法调用之前观察
  • [-e]: 在方法异常之后观察
  • [-s]: 在方法返回之后观察
  • [-f]: 在方法结束之后(正常返回和异常返回)观察
  • [-x 1]: 指定输出结果的属性遍历深度,默认为 1

monitor(方法执行监控): 数据

  • timestamp: 时间戳
  • class: Java类
  • method: 方法(构造方法、普通方法)
  • total: 调用次数
  • success: 成功次数
  • fail: 失败次数
  • rt: 平均RT
  • fail-rate: 失败率

    参数

  • class-pattern: 类名表达式匹配
  • method-pattern: 方法名表达式匹配
  • [condition-express]: 条件表达式
  • [-c 5]: 统计周期(s),默认120
  • [-b]: 在方法调用之前计算condition-express

trace(方法内部调用路径,并输出方法路径上每个节点耗时): 参数

  • class-pattern: 类名表达式匹配
  • method-pattern: 方法名表达式匹配
  • [condition-express]: 条件表达式
  • [-n 2]: 命令执行次数
  • [-skipJDKMethod false]: 是否包含JDK里的函数,默认true不包含

stack(调用路径): 参数

  • class-pattern: 类名表达式匹配
  • method-pattern: 方法名表达式匹配
  • [condition-express]: 条件表达式
  • [-n 2]: 命令执行次数

tt(方法执行数据的时空隧道): 数据

  • INDEX: 时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。
  • TIMESTAMP: 方法执行的本机时间,记录了这个时间片段所发生的本机时间
  • COST(ms): 方法执行的耗时
  • IS-RET: 方法是否以正常返回的形式结束
  • IS-EXP: 方法是否以抛异常的形式结束
  • OBJECT: 执行对象的hashCode(),注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体
  • CLASS: 执行的类名
  • METHOD: 执行的方法名

参数

-t: 记录方法的每次执行情况

[-n 3]: 记录次数

解决方法重载

tt -t com.liu.demo.DemoService hello params.length==1

tt -t com.liu.demo.DemoService hello ‘params[1] instanceof Integer’

解决指定参数

tt -t com.liu.demo.DemoService hello params[0].mobile==”1200000000”

检索调用记录

tt -l

tt -s ‘method.name==”hello”‘

查看调用信息

tt -i 1001

重做一次调用

tt -i 1001 -p

使用

tt -t com.liu.demo.DemoService hello

profiler(使用async_profile生成火焰图): 参数

  • action: 要执行的操作
  • [-i 20000000]: 采样间隔(ns),默认值10’000’000,即10ms
  • [-f /tmp/output.svg]: 将输出转储到指定路径
  • [-d 10]: 运行评测指定秒
  • [-e cpu]: 要跟踪哪个事件cpu、alloc、lock、cache-misses等,默认是cpu

指令

  • profiler getSamples: 已采集数量
  • profiler status: 采集状态
  • profiler list: 支持的采集事件
  • profiler actions: 支持的action
  • profiler version: 查看版本

使用

  • profiler start
  • profiler start —event alloc
  • profiler start —framebuf 5000000
  • profiler start —include ‘java/‘ —include ‘demo/‘ —exclude ‘Unsafe.park
  • profiler start —duration 300
  • profiler start —file /tmp/test.jfr
  • profiler resume
  • profiler stop
  • profiler stop —file /tmp/output.svg
  • profiler stop —format html
  • profiler execute ‘start,framebuf=5000000’
  • profiler execute ‘stop,file=/tmp/result.svg’

常见指令 操作含义
基础命令
base64 base64编码转换,和linux里的base64命令类似
tee 复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
cls 清空当前屏幕区域
session 查看当前会话的信息
reset 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap Arthas快捷键列表及自定义快捷键
JVM相关
dashboard 当前系统的实时数据面板
thread 查看当前JVM的线程堆栈信息
jvm 查看当前 JVM 的信息
sysprop 查看和修改JVM的系统属性
sysenv 查看JVM的环境变量
vmoption 查看和修改JVM里诊断相关的option
perfcounter 查看当前 JVM 的Perf Counter信息
logger 查看和修改logger
getstatic 查看类的静态属性
ognl 执行ognl表达式
mbean 查看 Mbean 的信息
heapdump dump java heap, 类似jmap命令的heap dump功能
vmtool 从jvm里查询对象,执行forceGc
class/classloader 相关
sc 查看JVM已加载的类信息
sm 查看已加载类的方法信息
jad 反编译指定已加载类的源码
mc 内存编译器,内存编译.java文件为.class文件
retransform 加载外部的.class文件,retransform到JVM里
redefine 加载外部的.class文件,redefine到JVM里
dump dump 已加载类的 byte code 到特定目录
classloader 查看classloader的继承树,urls,类加载信息,使用classloader去getResource
monitor/watch/trace相关
monitor 方法执行监控
watch 方法执行数据观测
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
stack 输出当前方法被调用的调用路径
tt 方法执行数据的时空隧道,记录下指定方法的入参和返回信息,并能对这些不同的时间观测
profiler/火焰图
profiler 使用async-profiler对应用采样,生成火焰图
后台异步任务
使用 > 将结果重写向到日志文件,使用 & 指定命令是后台运行,session断开不影响任务执行(生命周期默认为1天)
jobs 列出所有job
kill 强制终止任务
fg 将暂停的任务拉到前台执行
bg 将暂停的任务放到后台执行