Arthas
-
它是什么?
Arthas
是Alibaba开源的Java诊断工具,深受开发者喜爱。 -
它能解决什么问题?
-
我想看一下jvm当前的运行状态,怎么看?
-
系统CPU跑到300%,怎么定位问题?
-
接口频繁超时,如何精准定位问题?
-
如何查看当前正在执行的源码?
-
小程序对接,看不到接口的返回值,怎么办?
-
线上发现代码出bug了,但是这时候无法紧急发版,怎么办?
-
如何在不发版的情况下更新日志级别?
..........
-
-
如何使用?
快速安装
使用arthas-boot
(推荐)
下载arthas-boot.jar
,然后用java -jar
的方式启动:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
打印帮助信息:
java -jar arthas-boot.jar -h
卸载
-
在 Linux/Unix/Mac 平台
删除下面文件:
rm -rf ~/.arthas/
rm -rf ~/logs/arthas -
Windows平台直接删除user home下面的
.arthas
和logs/arthas
目录
dashboard
查看当前系统的实时数据面板,按
ctrl+c
退出
参数说明
参数名称 | 参数说明 |
---|---|
[i:] | 刷新实时数据的时间间隔 (ms),默认5000ms |
[n:] | 刷新实时数据的次数 |
截图展示
数据说明:
-
thread:
-
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线程
-
-
memory:
-
heap
-
ps_eden_space:伊甸园
-
ps_survivor_space:幸存者区
-
ps_old_gen:老年代
-
-
nonheap
-
code_cache:代码缓存区
-
metaspace:元空间
-
compressed_class_space:压缩类空间
-
direct: Direct Memory,nio使用的堆外空间
-
mapped:内存映射文件,nio使用
-
-
-
GC:
-
gc.ps_scavenge.count:垃圾回收次数
-
gc.ps_scavenge.time(ms):垃圾回收消耗时间
-
gc.ps_marksweep.count:标记-清除算法的次数
-
gc.ps_marksweep.time(ms):标记-清除算法的消耗时间
-
-
Runtime: 当前系统参数
thread
查看当前线程信息,查看线程的堆栈
参数说明
参数名称 | 参数说明 |
---|---|
id | 线程id |
[n:] | 指定最忙的前N个线程并打印堆栈 |
[b] | 找出当前阻塞其他线程的线程 |
[i <value> ] |
指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200 |
[--all] | 显示所有匹配的线程 |
trace(线上环境高并发接口慎用)
方法内部调用路径,并输出方法路径上的每个节点上耗时
使用方式: trace 全类名 方法名
jad
反编译指定已加载类的源码
使用方式: jad 全类名
watch(线上环境高并发接口慎用)
方法执行数据观测
使用方式: watch 全类名 方法名
redefine(线上环境禁用)
热更新线上代码
通过
sc
查找需要修改的class的ClassLoadersc -d 全类名 | grep classLoaderHash
再使用redefine命令重新加载新编译好的class文件
redefine -c classLoaderHash class文件地址
logger
修改线上日志级别
通过sc命令查看JVM已加载的类信息,拿到classLoaderHash
sc -d 全类名 | grep classLoaderHash
更新指定类日志级别
logger -c classLoaderHash --name 全类名 --level 日志等级