文章目录
-
- 一、常用工具速查表
- [二、JDK 工具命令示例](#二、JDK 工具命令示例)
-
- [1. 查看 Java 进程](#1. 查看 Java 进程)
- [三、jstat:GC 与内存监控](#三、jstat:GC 与内存监控)
-
- [1. 每秒打印一次 GC 统计,共打印 10 次](#1. 每秒打印一次 GC 统计,共打印 10 次)
- [2. 查看 GC 原因和次数](#2. 查看 GC 原因和次数)
- [3. 查看新生代、老年代容量与使用情况](#3. 查看新生代、老年代容量与使用情况)
- [4. 快速判断 GC 是否异常](#4. 快速判断 GC 是否异常)
- 四、jstack:线程堆栈快照
-
- [1. 导出线程堆栈](#1. 导出线程堆栈)
- [2. 连续导出多次,便于对比 CPU 高线程](#2. 连续导出多次,便于对比 CPU 高线程)
- [3. 查找死锁](#3. 查找死锁)
- [五、CPU 飙高排查手册](#五、CPU 飙高排查手册)
-
- [场景一:Java 进程 CPU 飙高](#场景一:Java 进程 CPU 飙高)
-
- [第一步:找到 CPU 高的 Java 进程](#第一步:找到 CPU 高的 Java 进程)
- [第二步:查看线程 CPU 占用](#第二步:查看线程 CPU 占用)
- [第三步:将线程 PID 转成 16 进制](#第三步:将线程 PID 转成 16 进制)
- 第四步:在线程堆栈中查找该线程
- 第五步:分析线程状态与堆栈
- 六、线程堆栈特征速查
- 七、线程状态速查
- 八、常见线程问题排查
-
- [1. 死锁排查](#1. 死锁排查)
- [2. 线程阻塞排查](#2. 线程阻塞排查)
- [3. 线程池满/任务堆积排查](#3. 线程池满/任务堆积排查)
- 九、jmap:堆内存分析
-
- [1. 查看对象统计,不导出完整堆快照](#1. 查看对象统计,不导出完整堆快照)
- [2. 导出堆快照](#2. 导出堆快照)
- [3. 使用 MAT/JProfiler 分析堆快照](#3. 使用 MAT/JProfiler 分析堆快照)
- [十、OOM 排查手册](#十、OOM 排查手册)
-
- [1. 确认是否发生 OOM](#1. 确认是否发生 OOM)
- [2. 堆内存 OOM 快速排查](#2. 堆内存 OOM 快速排查)
- [3. 建议提前配置 OOM 自动 dump](#3. 建议提前配置 OOM 自动 dump)
- [十一、jinfo:查看和修改 JVM 参数](#十一、jinfo:查看和修改 JVM 参数)
-
- [1. 查看所有 JVM 参数](#1. 查看所有 JVM 参数)
- [2. 查看某个 JVM 参数](#2. 查看某个 JVM 参数)
- [3. 查看所有 flags](#3. 查看所有 flags)
- [4. 动态修改部分参数](#4. 动态修改部分参数)
- [十二、Arthas 使用](#十二、Arthas 使用)
-
- [1. 启动 Arthas](#1. 启动 Arthas)
- [2. 查看帮助](#2. 查看帮助)
- [3. 查看 JVM 信息](#3. 查看 JVM 信息)
- [4. 查看系统属性](#4. 查看系统属性)
- [5. 查看环境变量](#5. 查看环境变量)
- [6. 查看 JVM 参数](#6. 查看 JVM 参数)
- [十三、Arthas 线程诊断](#十三、Arthas 线程诊断)
-
- [1. 查看线程概览](#1. 查看线程概览)
- [2. 查看 CPU 占用最高的前 3 个线程](#2. 查看 CPU 占用最高的前 3 个线程)
- [3. 查看指定线程](#3. 查看指定线程)
- [4. 查看阻塞线程](#4. 查看阻塞线程)
- [5. 查看死锁](#5. 查看死锁)
- [十四、Arthas 类与方法诊断](#十四、Arthas 类与方法诊断)
-
- [1. 查找类](#1. 查找类)
- [2. 查找方法](#2. 查找方法)
- [十五、Arthas 方法耗时分析:trace](#十五、Arthas 方法耗时分析:trace)
-
- [1. 追踪方法内部耗时](#1. 追踪方法内部耗时)
- [2. 只追踪耗时大于 200ms 的调用](#2. 只追踪耗时大于 200ms 的调用)
- [3. 限制追踪次数](#3. 限制追踪次数)
- [4. 多层追踪](#4. 多层追踪)
- [十六、Arthas 方法参数观测:watch](#十六、Arthas 方法参数观测:watch)
-
- [1. 查看方法入参](#1. 查看方法入参)
- [2. 查看入参和返回值](#2. 查看入参和返回值)
- [3. 查看入参、返回值和异常](#3. 查看入参、返回值和异常)
- [4. 只在方法抛异常时观察](#4. 只在方法抛异常时观察)
- [5. 按条件过滤](#5. 按条件过滤)
- [6. 限制观察次数](#6. 限制观察次数)
- [十七、Arthas 方法调用监控:monitor](#十七、Arthas 方法调用监控:monitor)
-
- [1. 统计方法调用次数、成功率、平均耗时](#1. 统计方法调用次数、成功率、平均耗时)
- [2. 每 10 秒统计一次](#2. 每 10 秒统计一次)
- [十八、Arthas 方法调用栈:stack](#十八、Arthas 方法调用栈:stack)
-
- [1. 查看方法被谁调用](#1. 查看方法被谁调用)
- [2. 按条件过滤](#2. 按条件过滤)
- [3. 限制次数](#3. 限制次数)
- [十九、Arthas 反编译:jad](#十九、Arthas 反编译:jad)
-
- [1. 反编译类](#1. 反编译类)
- [2. 只看某个方法](#2. 只看某个方法)
- [二十、Arthas 热更新:redefine / retransform](#二十、Arthas 热更新:redefine / retransform)
-
- [1. 反编译源码](#1. 反编译源码)
- [2. 修改源码后编译](#2. 修改源码后编译)
- [3. 热加载 class](#3. 热加载 class)
- [二十一、Arthas 内存诊断](#二十一、Arthas 内存诊断)
-
- [1. 查看堆内存概况](#1. 查看堆内存概况)
- [2. 只 dump 存活对象](#2. 只 dump 存活对象)
- [3. 查看对象实例](#3. 查看对象实例)
- [二十二、Arthas 性能诊断:profiler](#二十二、Arthas 性能诊断:profiler)
-
- [1. 开始采样](#1. 开始采样)
- [2. 查看采样状态](#2. 查看采样状态)
- [3. 停止并生成火焰图](#3. 停止并生成火焰图)
- [4. CPU 火焰图](#4. CPU 火焰图)
- [5. 内存分配火焰图](#5. 内存分配火焰图)
- [二十三、JDK 工具 vs Arthas 场景对比](#二十三、JDK 工具 vs Arthas 场景对比)
- 二十四、常见问题快速处理流程
-
- [1. CPU 飙高](#1. CPU 飙高)
- [2. 接口变慢](#2. 接口变慢)
- [3. 线程死锁](#3. 线程死锁)
- [4. 线程池阻塞](#4. 线程池阻塞)
- [5. OOM / 内存泄漏](#5. OOM / 内存泄漏)
- [6. 确认线上代码逻辑](#6. 确认线上代码逻辑)
- [7. 查看方法入参和返回值](#7. 查看方法入参和返回值)
- 二十五、生产环境安全使用建议
-
- [1. 优先级建议](#1. 优先级建议)
- [2. 高风险操作](#2. 高风险操作)
- [3. Arthas 使用后及时退出](#3. Arthas 使用后及时退出)
- 二十六、常用命令速查卡片
- 适用场景:CPU 飙高、线程阻塞/死锁、OOM、内存泄漏、方法耗时、参数确认、线上问题快速定位。
- 使用原则:优先使用低影响工具;堆快照、Arthas 深度诊断需谨慎,生产环境注意 STW 与性能影响。
一、常用工具速查表
| 工具 | 核心能力 | 适用场景 | 是否影响性能 |
|---|---|---|---|
jstat |
监控 GC 和内存统计 | 观察 GC 频率、各代内存变化 | 几乎无影响 |
jmap |
堆内存快照、对象统计 | OOM 排查、内存泄漏定位 | 有 STW 风险 |
jstack |
线程堆栈快照 | CPU 飙高、线程死锁、线程阻塞 | 轻微影响 |
jinfo |
查看和修改运行时参数 | 确认 JVM 参数、动态开关 GC 日志 | 几乎无影响 |
Arthas |
全方位在线诊断 | 热更新、方法追踪、实时监控 | 中等影响 |
二、JDK 工具命令示例
1. 查看 Java 进程
bash
jps -lvm
或:
bash
jps -l
示例输出:
text
12345 com.example.app.Application
12346 sun.tools.jps.Jps
后续命令中的 PID 通常就是 Java 进程号,例如 12345。
三、jstat:GC 与内存监控
1. 每秒打印一次 GC 统计,共打印 10 次
bash
jstat -gc PID 1000 10
示例:
bash
jstat -gc 12345 1000 10
2. 查看 GC 原因和次数
bash
jstat -gccause PID 1000 10
示例:
bash
jstat -gccause 12345 1000 10
3. 查看新生代、老年代容量与使用情况
bash
jstat -gcutil PID 1000 10
示例:
bash
jstat -gcutil 12345 1000 10
常见输出字段:
| 字段 | 含义 |
|---|---|
| S0 | Survivor 0 区使用率 |
| S1 | Survivor 1 区使用率 |
| E | Eden 区使用率 |
| O | Old 老年代使用率 |
| M | Metaspace 使用率 |
| YGC | Young GC 次数 |
| YGCT | Young GC 总耗时 |
| FGC | Full GC 次数 |
| FGCT | Full GC 总耗时 |
| GCT | GC 总耗时 |
4. 快速判断 GC 是否异常
重点关注:
text
FGC 是否快速增长
FGCT 是否很大
O 区是否长期接近 100%
YGC 是否过于频繁
例如:
text
O = 99%
FGC 持续增长
FGCT 很大
通常说明老年代压力大,可能存在内存泄漏、对象晋升过快、堆配置过小等问题。
四、jstack:线程堆栈快照
1. 导出线程堆栈
bash
jstack PID > thread_dump_$(date +%Y%m%d_%H%M%S).txt
示例:
bash
jstack 12345 > thread_dump_$(date +%Y%m%d_%H%M%S).txt
2. 连续导出多次,便于对比 CPU 高线程
bash
jstack 12345 > thread_1.txt
sleep 5
jstack 12345 > thread_2.txt
sleep 5
jstack 12345 > thread_3.txt
3. 查找死锁
bash
jstack PID | grep -A 30 "Found one Java-level deadlock"
示例:
bash
jstack 12345 | grep -A 30 "Found one Java-level deadlock"
如果没有死锁,可能没有输出。
五、CPU 飙高排查手册
场景一:Java 进程 CPU 飙高
第一步:找到 CPU 高的 Java 进程
bash
top
或:
bash
top -c
记录 Java 进程 PID,例如 12345。
第二步:查看线程 CPU 占用
bash
top -Hp PID
示例:
bash
top -Hp 12345
找到 CPU 占用最高的线程 PID,例如 12378。
第三步:将线程 PID 转成 16 进制
bash
printf "%x\n" 12378
输出示例:
text
305a
第四步:在线程堆栈中查找该线程
bash
jstack 12345 | grep -A 50 "nid=0x305a"
示例:
bash
jstack 12345 | grep -A 50 "nid=0x305a"
第五步:分析线程状态与堆栈
重点看线程状态:
text
RUNNABLE
BLOCKED
WAITING
TIMED_WAITING
如果线程是 RUNNABLE,并且堆栈停留在业务代码、正则、序列化、加密、循环等位置,通常就是 CPU 消耗点。
六、线程堆栈特征速查
| 堆栈特征 | 可能原因 |
|---|---|
RUNNABLE + 正则表达式 |
正则回溯导致 CPU 飙升 |
RUNNABLE + 自旋代码 |
死循环或自旋锁 |
RUNNABLE + 序列化/反序列化 |
大对象 JSON 解析 |
RUNNABLE + 加密算法 |
CPU 密集型计算 |
七、线程状态速查
| 状态 | 含义 | 需要关注吗 |
|---|---|---|
RUNNABLE |
正在运行或等待 CPU | CPU 高时关注 |
BLOCKED |
等待获取锁 | 锁竞争严重时关注 |
WAITING |
无限期等待,例如 wait/join/park |
线程池满时关注 |
TIMED_WAITING |
有超时的等待,例如 sleep/wait(timeout) |
大量出现时关注 |
WAITING on condition |
等待某个条件,例如 IO、锁 | 连接池满时关注 |
八、常见线程问题排查
1. 死锁排查
bash
jstack PID | grep -A 50 "Found one Java-level deadlock"
示例:
bash
jstack 12345 | grep -A 50 "Found one Java-level deadlock"
死锁堆栈通常类似:
text
Found one Java-level deadlock:
=============================
"thread-1":
waiting to lock monitor 0x...
which is held by "thread-2"
"thread-2":
waiting to lock monitor 0x...
which is held by "thread-1"
处理方向:
text
检查加锁顺序是否一致
减少锁粒度
避免嵌套锁
使用 tryLock 超时机制
2. 线程阻塞排查
查看 BLOCKED 线程:
bash
jstack PID | grep -A 30 "BLOCKED"
示例:
bash
jstack 12345 | grep -A 30 "BLOCKED"
重点看:
text
waiting to lock <0x...>
locked <0x...>
可以通过锁地址继续搜索持有锁的线程:
bash
jstack PID | grep -A 30 "locked <0x000000076ab62208>"
3. 线程池满/任务堆积排查
查看大量 WAITING 或 TIMED_WAITING:
bash
jstack PID | grep -A 20 "WAITING"
或:
bash
jstack PID | grep -A 20 "TIMED_WAITING"
如果大量线程停在队列获取任务、连接池获取连接、数据库连接池等位置,需要关注:
text
线程池大小是否合理
任务是否处理过慢
下游接口是否超时
连接池是否打满
是否存在慢 SQL
九、jmap:堆内存分析
注意:
jmap堆快照可能导致 STW,生产环境谨慎使用。大堆服务尤其要评估影响。
1. 查看对象统计,不导出完整堆快照
bash
jmap -histo PID | head -50
示例:
bash
jmap -histo 12345 | head -50
如果只看存活对象:
bash
jmap -histo:live PID | head -50
示例:
bash
jmap -histo:live 12345 | head -50
输出示例:
text
num #instances #bytes class name
----------------------------------------------
1: 123456 29629440 [B
2: 98765 12345678 java.lang.String
3: 54321 9876543 java.util.HashMap$Node
重点关注:
text
byte[]
char[]
String
HashMap
ArrayList
业务对象
第三方缓存对象
2. 导出堆快照
bash
jmap -dump:format=b,file=heap_dump.hprof PID
示例:
bash
jmap -dump:format=b,file=/tmp/heap_dump.hprof 12345
如果只导出存活对象:
bash
jmap -dump:live,format=b,file=/tmp/heap_dump_live.hprof PID
示例:
bash
jmap -dump:live,format=b,file=/tmp/heap_dump_live.hprof 12345
3. 使用 MAT/JProfiler 分析堆快照
常用分析工具:
text
Eclipse MAT
JProfiler
VisualVM
JDK Mission Control
分析重点:
text
Dominator Tree
Leak Suspects
Histogram
GC Roots
对象引用链
Retained Heap
常见内存泄漏场景:
text
静态 Map/List 持续增长
本地缓存没有淘汰策略
ThreadLocal 未清理
连接/流未关闭
监听器/回调未注销
大对象长期被引用
十、OOM 排查手册
1. 确认是否发生 OOM
查看应用日志:
bash
grep -i "OutOfMemoryError" app.log
常见 OOM 类型:
| OOM 类型 | 可能原因 |
|---|---|
Java heap space |
堆内存不足,对象过多或内存泄漏 |
GC overhead limit exceeded |
GC 占用过高,回收效果差 |
Metaspace |
类加载过多,常见于动态代理、热部署 |
unable to create new native thread |
线程数过多或系统限制 |
Direct buffer memory |
堆外内存不足,常见于 NIO、Netty |
2. 堆内存 OOM 快速排查
bash
jstat -gcutil PID 1000 10
jmap -histo:live PID | head -50
jmap -dump:live,format=b,file=/tmp/heap_dump.hprof PID
示例:
bash
jstat -gcutil 12345 1000 10
jmap -histo:live 12345 | head -50
jmap -dump:live,format=b,file=/tmp/heap_dump.hprof 12345
3. 建议提前配置 OOM 自动 dump
JVM 参数示例:
bash
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/logs/heap
完整示例:
bash
java \
-Xms4g \
-Xmx4g \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/data/logs/heap \
-jar app.jar
十一、jinfo:查看和修改 JVM 参数
1. 查看所有 JVM 参数
bash
jinfo PID
示例:
bash
jinfo 12345
2. 查看某个 JVM 参数
bash
jinfo -flag MaxHeapSize PID
示例:
bash
jinfo -flag MaxHeapSize 12345
输出示例:
text
-XX:MaxHeapSize=4294967296
3. 查看所有 flags
bash
jinfo -flags PID
示例:
bash
jinfo -flags 12345
4. 动态修改部分参数
例如开启 GC 日志相关参数,具体是否支持取决于 JDK 版本和参数类型。
bash
jinfo -flag +PrintGCDetails PID
示例:
bash
jinfo -flag +PrintGCDetails 12345
关闭:
bash
jinfo -flag -PrintGCDetails PID
示例:
bash
jinfo -flag -PrintGCDetails 12345
注意:JDK 9+ 推荐使用
-Xlog:gc*统一日志参数,部分旧参数可能不可用。
十二、Arthas 使用
Arthas 功能强,但有一定性能影响。生产环境建议短时间使用,排查完成后及时
stop或shutdown。
1. 启动 Arthas
bash
java -jar arthas-boot.jar
或指定 PID:
bash
java -jar arthas-boot.jar PID
示例:
bash
java -jar arthas-boot.jar 12345
2. 查看帮助
bash
help
3. 查看 JVM 信息
bash
jvm
4. 查看系统属性
bash
sysprop
查看单个属性:
bash
sysprop java.version
5. 查看环境变量
bash
sysenv
6. 查看 JVM 参数
bash
vmoption
查看某个参数:
bash
vmoption PrintGC
修改参数示例:
bash
vmoption PrintGC true
十三、Arthas 线程诊断
1. 查看线程概览
bash
thread
2. 查看 CPU 占用最高的前 3 个线程
bash
thread -n 3
这是 CPU 飙高排查最常用命令。
3. 查看指定线程
bash
thread 线程ID
示例:
bash
thread 45
4. 查看阻塞线程
bash
thread -b
该命令可以帮助定位造成阻塞的线程。
5. 查看死锁
bash
thread -b
或结合 JDK:
bash
jstack PID | grep -A 50 "Found one Java-level deadlock"
十四、Arthas 类与方法诊断
1. 查找类
bash
sc com.example.*
示例:
bash
sc com.example.service.*
查看类详细信息:
bash
sc -d com.example.service.OrderService
2. 查找方法
bash
sm com.example.service.OrderService
查看方法详细信息:
bash
sm -d com.example.service.OrderService createOrder
十五、Arthas 方法耗时分析:trace
1. 追踪方法内部耗时
bash
trace com.example.service.OrderService createOrder
示例:
bash
trace com.example.service.OrderService createOrder
2. 只追踪耗时大于 200ms 的调用
bash
trace com.example.service.OrderService createOrder '#cost > 200'
3. 限制追踪次数
bash
trace com.example.service.OrderService createOrder -n 5
4. 多层追踪
bash
trace com.example.service.OrderService createOrder -n 5 --skipJDKMethod false
十六、Arthas 方法参数观测:watch
1. 查看方法入参
bash
watch com.example.service.OrderService createOrder "{params}"
2. 查看入参和返回值
bash
watch com.example.service.OrderService createOrder "{params, returnObj}"
3. 查看入参、返回值和异常
bash
watch com.example.service.OrderService createOrder "{params, returnObj, throwExp}"
4. 只在方法抛异常时观察
bash
watch com.example.service.OrderService createOrder "{params, throwExp}" -e
5. 按条件过滤
例如只看第一个参数等于某个订单 ID:
bash
watch com.example.service.OrderService createOrder "{params, returnObj}" 'params[0]=="ORDER1001"'
6. 限制观察次数
bash
watch com.example.service.OrderService createOrder "{params, returnObj}" -n 5
十七、Arthas 方法调用监控:monitor
1. 统计方法调用次数、成功率、平均耗时
bash
monitor com.example.service.OrderService createOrder
2. 每 10 秒统计一次
bash
monitor com.example.service.OrderService createOrder -c 10
输出字段通常包括:
text
timestamp
class
method
total
success
fail
avg-rt
fail-rate
十八、Arthas 方法调用栈:stack
1. 查看方法被谁调用
bash
stack com.example.service.OrderService createOrder
2. 按条件过滤
bash
stack com.example.service.OrderService createOrder 'params[0]=="ORDER1001"'
3. 限制次数
bash
stack com.example.service.OrderService createOrder -n 5
十九、Arthas 反编译:jad
1. 反编译类
bash
jad com.example.service.OrderService
2. 只看某个方法
bash
jad com.example.service.OrderService createOrder
适用场景:
text
确认线上代码版本是否正确
确认热修复是否生效
确认配置开关是否进入预期分支
二十、Arthas 热更新:redefine / retransform
生产环境谨慎使用。只建议用于紧急修复或测试环境验证。
1. 反编译源码
bash
jad --source-only com.example.service.OrderService > /tmp/OrderService.java
2. 修改源码后编译
bash
mc -c 类加载器hash /tmp/OrderService.java -d /tmp
示例:
bash
mc /tmp/OrderService.java -d /tmp
3. 热加载 class
bash
redefine /tmp/com/example/service/OrderService.class
或使用:
bash
retransform /tmp/com/example/service/OrderService.class
二十一、Arthas 内存诊断
1. 查看堆内存概况
bash
heapdump
或指定文件:
bash
heapdump /tmp/heap_dump.hprof
2. 只 dump 存活对象
bash
heapdump --live /tmp/heap_dump_live.hprof
3. 查看对象实例
bash
vmtool --action getInstances --className java.lang.String --limit 10
示例:
bash
vmtool --action getInstances --className com.example.entity.Order --limit 10
二十二、Arthas 性能诊断:profiler
1. 开始采样
bash
profiler start
2. 查看采样状态
bash
profiler status
3. 停止并生成火焰图
bash
profiler stop --format html --file /tmp/flame.html
或:
bash
profiler stop --file /tmp/flame.html
4. CPU 火焰图
bash
profiler start --event cpu
profiler stop --file /tmp/cpu_flame.html
5. 内存分配火焰图
bash
profiler start --event alloc
profiler stop --file /tmp/alloc_flame.html
二十三、JDK 工具 vs Arthas 场景对比
| 场景 | JDK 工具 | Arthas | 优势 |
|---|---|---|---|
| CPU 飙高排查 | top + printf + jstack |
thread -n 3 |
Arthas 一步到位 |
| 方法耗时分析 | 只能看日志或加代码 | trace |
无侵入 |
| 方法参数观测 | 加日志重启 | watch |
无需重启 |
| 内存分析 | jmap -histo |
heapdump + vmtool |
更灵活 |
| 查看 JVM 参数 | jinfo |
vmoption |
更直观 |
二十四、常见问题快速处理流程
1. CPU 飙高
bash
top
top -Hp PID
printf "%x\n" 线程PID
jstack PID | grep -A 50 "nid=0x线程16进制"
Arthas 方式:
bash
thread -n 3
2. 接口变慢
bash
jstack PID > thread.txt
jstat -gcutil PID 1000 10
Arthas 方式:
bash
trace com.example.service.OrderService createOrder '#cost > 200'
monitor com.example.service.OrderService createOrder -c 10
3. 线程死锁
bash
jstack PID | grep -A 50 "Found one Java-level deadlock"
Arthas 方式:
bash
thread -b
4. 线程池阻塞
bash
jstack PID | grep -A 30 "BLOCKED"
jstack PID | grep -A 30 "WAITING"
jstack PID | grep -A 30 "TIMED_WAITING"
Arthas 方式:
bash
thread
thread -b
5. OOM / 内存泄漏
bash
jstat -gcutil PID 1000 10
jmap -histo:live PID | head -50
jmap -dump:live,format=b,file=/tmp/heap_dump.hprof PID
Arthas 方式:
bash
heapdump --live /tmp/heap_dump_live.hprof
vmtool --action getInstances --className com.example.entity.Order --limit 10
6. 确认线上代码逻辑
Arthas 方式:
bash
jad com.example.service.OrderService createOrder
7. 查看方法入参和返回值
Arthas 方式:
bash
watch com.example.service.OrderService createOrder "{params, returnObj, throwExp}" -n 5
二十五、生产环境安全使用建议
1. 优先级建议
text
jstat / jinfo / jstack
↓
jmap -histo
↓
jmap -dump
↓
Arthas trace / watch / profiler
2. 高风险操作
以下操作生产环境要谨慎:
bash
jmap -dump
jmap -histo:live
heapdump
profiler
redefine
retransform
watch 高频方法
trace 高频方法
3. Arthas 使用后及时退出
bash
quit
或:
bash
stop
彻底关闭:
bash
shutdown
二十六、常用命令速查卡片
CPU 高
bash
top
top -Hp PID
printf "%x\n" TID
jstack PID | grep -A 50 "nid=0xTID_HEX"
Arthas:
bash
thread -n 3
死锁
bash
jstack PID | grep -A 50 "Found one Java-level deadlock"
Arthas:
bash
thread -b
GC 观察
bash
jstat -gcutil PID 1000 10
jstat -gccause PID 1000 10
对象统计
bash
jmap -histo PID | head -50
jmap -histo:live PID | head -50
堆快照
bash
jmap -dump:format=b,file=/tmp/heap.hprof PID
jmap -dump:live,format=b,file=/tmp/heap_live.hprof PID
Arthas:
bash
heapdump /tmp/heap.hprof
heapdump --live /tmp/heap_live.hprof
JVM 参数
bash
jinfo PID
jinfo -flags PID
jinfo -flag MaxHeapSize PID
Arthas:
bash
vmoption
vmoption PrintGC
方法耗时
bash
trace com.example.service.OrderService createOrder
trace com.example.service.OrderService createOrder '#cost > 200'
方法参数
bash
watch com.example.service.OrderService createOrder "{params, returnObj, throwExp}" -n 5
方法调用来源
bash
stack com.example.service.OrderService createOrder -n 5
反编译
bash
jad com.example.service.OrderService
jad com.example.service.OrderService createOrder
火焰图
bash
profiler start
profiler stop --file /tmp/flame.html