一、Arthas快速入门
1.1、下载arthas
下载地址:https://github.com/alibaba/arthas/releases
其中 math-game.jar 是一个官方提供的demo,arthas-boot.jar 是arthas的主要程序。
1.2、启动math-game.jar
java -jar math-game.jar
math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
1.3、启动arthas
java -jar arthas-boot.jar
Arthas会attach到目标进程上,所以在启动的时候会列出系统当前的java进程,输入需要查看的进程,就可以将Arthas attach到选择的进程上。
Arthas启动成功后,界面如下图所示
与此同时,官方也提供了web界面供大家使用,通过访问 http://localhost:3658 可以进入Arthas 界面
二、Arthas基础命令
2.1、基础命令
1、help
查看命令帮助信息
2、cat
查看文件内容,和linux里的cat命令类似,查看arthas目录下的arthas.properties
3、grep
4、pwd
5、cls
查看当前会话的信息
version
输出当前目标 Java 进程所加载的 Arthas 版本号
history
打印命令历史
quit
作用
退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
stop
作用
关闭 Arthas 服务端,所有 Arthas 客户端全部退出
效果
keymap
作用
Arthas快捷键列表及自定义快捷键
Arthas 命令行快捷键
快捷键说明 | 命令说明 |
ctrl + a | 跳到行首 |
ctrl + e | 跳到行尾 |
ctrl + f | 向前移动一个单词 |
ctrl + b | 向后移动一个单词 |
键盘左方向键 | 光标向前移动一个字符 |
键盘右方向键 | 光标向后移动一个字符 |
键盘下方向键 | 下翻显示下一个命令 |
键盘上方向键 | 上翻显示上一个命令 |
ctrl + h | 向后删除一个字符 |
ctrl + shift + / | 向后删除一个字符 |
ctrl + u | 撤销上一个命令,相当于清空当前行 |
ctrl + d | 删除当前光标所在字符 |
ctrl + k | 删除当前光标到行尾的所有字符 |
ctrl + i | 自动补全,相当于敲TAB |
ctrl + j | 结束当前行,相当于敲回车 |
ctrl + m | 结束当前行,相当于敲回车 |
- 任何时候 tab 键,会根据当前的输入给出提示
- 命令后敲 - 或 -- ,然后按 tab 键,可以展示出此命令具体的选项
后台异步命令相关快捷键
- ctrl + c: 终止当前命令
- ctrl + z: 挂起当前命令,后续可以 bg/fg 重新支持此命令,或 kill 掉
- ctrl + a: 回到行首
- ctrl + e: 回到行尾
小结
命令 | 说明 |
session | 显示当前会话的信息:进程的ID,会话ID |
reset | 重置类的增强,服务器关闭的时候会自动重置所有的类 |
version | 显示arthas版本号 |
quit | 退出当前会话,不会影响其它的会话 |
stop | 退出arthas服务器,所有的会话都停止 |
keymap | 获取快捷键 |
1、dashboard
当前系统的实时数据面板,如HTTP请求的qps, runtime, 错误数, 线程池信息等等。
输入 Q 或者 Ctrl+C 可以退出dashboard命令。
数据说明
- 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线程
JVM内部线程
Java 8之后支持获取JVM内部线程CPU时间,这些线程只有名称和CPU时间,没有ID及状态等信息(显示ID为-1)。 通过内部线程可以观测到JVM活动,如GC、JIT编译等占用CPU情况,方便了解JVM整体运行状况。
- 当JVM 堆(heap)/元数据(metaspace)空间不足或OOM时,可以看到GC线程的CPU占用率明显高于其他的线程。
- 当执行trace/watch/tt/redefine等命令后,可以看到JIT线程活动变得更频繁。因为JVM热更新class字节码时清除了此class相关的JIT编译结果,需要重新编译。
JVM内部线程包括下面几种:
- JIT编译线程: 如 C1 CompilerThread0, C2 CompilerThread0
- GC线程: 如GC Thread0, G1 Young RemSet Sampling
- 其它内部线程: 如VM Periodic Task Thread, VM Thread, Service Thread
运行环境
2、thread
查看当前线程信息,查看线程的堆栈
参数说明
参数名称 | 参数说明 |
id | 线程id |
[n:] | 指定最忙的前N个线程并打印堆栈 |
[b] | 找出当前阻塞其他线程的线程 |
[i <value>] | 指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200 |
[--all] | 显示所有匹配的线程 |
查看死锁
thread -b
thread -i, 指定采样时间间隔
- thread-i1000 : 统计最近1000ms内的线程CPU时间。
- thread-n3-i1000 : 列出1000ms内最忙的3个线程栈
jvm
查看当前 JVM 的信息
sysprop
查看和修改JVM的系统属性
查看单个属性
支持通过TAB键自动补全
sysprop java.version
修改单个属性
sysprop user.country US
sysenv
sysenv:查看当前JVM的环境属性(SystemEnvironmentVariables)
查看单个环境变量
[arthas@33676]$ sysenv USER
vmoption
查看,更新VM诊断相关的参数
查看指定的option
vmoption PrintGC
修改指定的option
vmoption PrintGC true
getstatic(不推荐)
通过getstatic命令可以方便的查看类的静态属性。使用方法为getstatic class_name field_name
getstatic java.util.HashMap DEFAULT_LOAD_FACTOR
ognl
执行ognl表达式
调用静态函数:
ognl '@java.time.LocalDateTime@now()'
获取静态类的静态字段:
ognl '@java.util.ArrayList@DEFAULT_CAPACITY'
执行静态方法
ognl '#value=@java.time.LocalDate@of(2022,1,1)'
执行多行表达式,赋值给临时变量,返回一个List:
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
perfcounter——查看当前 JVM 的Perf Counter信息
logger——查看和修改logger
mbean——查看 Mbean 的信息
heapdump——dump java heap, 类似jmap命令的heap dump功能
vmtool——从jvm里查询对象,执行forceGc