Arthas开源的Java 诊断工具,无需重启、无需修改代码,即可:
- 查看 JVM 状态(线程、内存、GC)
- 动态追踪方法调用(入参、返回值、异常)
- 监控对象实例数量
- 生成堆转储(heap dump)
- 反编译线上 class
- 执行 OGNL 表达式操作对象
下载安装:
bash
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
核心命令:
| 类别 | 命令 | 用途 |
|---|---|---|
| 基础 | help |
查看帮助 |
version |
查看版本 | |
quit / exit |
退出 | |
stop |
完全退出并 detach | |
| JVM 信息 | dashboard |
实时仪表盘 |
memory |
内存使用详情 | |
thread |
查看线程 | |
sysprop |
查看/设置系统属性 | |
sysenv |
查看环境变量 | |
| 类 & 方法 | sc |
搜索类 |
sm |
搜索方法 | |
jad |
反编译 class | |
mc + redefine |
热更新 class | |
| 监控 & 追踪 | watch |
监控方法入参/返回值/异常 |
trace |
方法调用路径耗时分析 | |
monitor |
方法调用统计 | |
tt |
时间隧道 | |
| 内存诊断 | vmtool |
获取 JVM 中对象实例 |
ognl |
执行 OGNL 表达式 | |
heapdump |
生成堆转储 | |
| 其他 | logger |
查看/修改日志级别 |
perfcounter |
查看 JVM 性能计数器 |
常用命令:
- 查看CPU飙高的线程:
bash
thread -n 3
thread <tid>
- 动态修改日志级别(无需重启)
bash
logger
logger --name ROOT --level DEBUG
- 监控方法 QPS 和异常
bash
monitor com.yourcompany.WebSocketHandler channelRead0 -c 5
- 执行任意Java表达式
bash
# 调用静态方法
ognl '@java.lang.System@currentTimeMillis()'
#获取 classloader hash
sc -d com.example.YourClass
# 调用实例方法
ognl -c 18b4aac2 '@com.example.Cache@getInstance().size()'
下面以排查WebSocket堆外内存泄露问题举例:
经排查,怀疑 是WebSocket 消息未释放导致内存增长。
- 确认类是否存在
sc io.netty.handler.codec.http.websocketx.TextWebSocketFrame
- 查看当前存活实例数
vmtool --action getInstances --className io.netty.handler.codec.http.websocketx.TextWebSocketFrame --limit 1000 | wc -l
- 查看实例内容
vmtool --action getInstances --className io.netty.handler.codec.http.websocketx.TextWebSocketFrame --limit 1 --express 'instances[0].text()'
- 追踪其创建对象
watch io.netty.handler.codec.http.websocketx.TextWebSocketFrame <init> '{params, returnObj}' -x 3
- 检查 Netty Direct Memory 使用
ognl '@io.netty.buffer.PooledByteBufAllocator@DEFAULT.metric().usedDirectMemory()'
- 生成 heap dump(用于 MAT 分析)
heapdump /tmp/websocket-leak.hprof