JVM线上故障快速排

文章目录

    • 一、常用工具速查表
    • [二、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 飙高排查手册)
    • 六、线程堆栈特征速查
    • 七、线程状态速查
    • 八、常见线程问题排查
      • [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. 线程池满/任务堆积排查

查看大量 WAITINGTIMED_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 功能强,但有一定性能影响。生产环境建议短时间使用,排查完成后及时 stopshutdown

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
相关推荐
落苜蓿蓝1 小时前
Java 循环中对象复用导致属性覆盖?从 JVM 内存模型讲解原因
java·jvm·python
Tim_1021 小时前
【C++】021、RAII
jvm
格兰芬多呼神护卫21 小时前
# Agent 企业评估方案深度分析:从“看答案”到持续质量闭环_码士教育
java·开发语言·jvm
CodeStats1 天前
【Java GC】Java JVM 垃圾回收(GC)完全指南:从内存结构到并发回收的底层原理
java·jvm·gc·垃圾回收·zgc·内存结构
ChaHae-In1 天前
JVM运行时数据区与垃圾回收
jvm
IKUN家族2 天前
Spring JVM(二)
java·jvm·spring
程序员天天困2 天前
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
java·jvm·后端
长不胖的路人甲2 天前
Serial 串行、Parallel 并行、CMS 并发收集器
java·开发语言·jvm
音符犹如代码2 天前
Arthas classloader + sc 实战:JVM 类加载与手动加载
java·jvm·spring boot