以下是根据 Java 生态最新技术演进整理的调试排错工具清单,涵盖从基础诊断到高级分析的完整工具链,按使用场景和问题类型分类:
一、基础诊断工具集
工具名称 | 核心功能 | 典型场景 | 使用示例 |
---|---|---|---|
jps | 列出所有Java进程PID | 快速定位服务进程 | jps -l -m |
jstack | 生成线程快照(含锁状态) | 死锁排查/CPU飙高 | jstack -l 1234 > thread_dump.log |
jmap | 堆内存分析(直方图/Dump生成) | OOM问题追踪 | jmap -histo:live 1234 |
jstat | 实时监控GC统计 | GC频率/耗时分析 | jstat -gcutil 1234 1000 5 |
jcmd | 多功能诊断命令(替代jstack/jmap) | 综合故障排查 | jcmd 1234 VM.native_memory |
二、可视化分析平台
-
VisualVM
- 功能集成:CPU/Memory采样、线程监控、堆dump分析
- 增强插件:BTrace动态插桩、OQL查询语言
-
JProfiler(商用)
- 实时内存泄漏检测
- 方法级CPU热点分析
-
Eclipse MAT
- 内存泄漏自动分析(支配树视图)
- 大对象定位(保留集分析)
三、线上诊断利器
1. Arthas
教程: https://arthas.aliyun.com/doc/quick-start.html
# 实时监控方法耗时
watch com.example.Service * '{params,returnObj}' -x 3 -n 5
# 反编译线上类
jad --source-only com.example.Config > Config.java
# 线程阻塞诊断
thread -b
2. BTrace
教程: https://github.com/btraceio/btrace/blob/develop/docs/BTraceTutorial.md
@OnMethod(clazz="java.lang.Thread", method="start")
public static void traceThreadStart() {
println("Thread started: " + name());
}
3. Async-Profiler
教程: https://github.com/async-profiler/async-profiler/tree/master/docs
# 生成火焰图
./profiler.sh -d 30 -f flamegraph.html 1234
四、高级调试框架
方案类型 | 代表工具 | 核心能力 | 适用阶段 |
---|---|---|---|
APM监控 | SkyWalking/Pinpoint | 分布式链路追踪+JVM指标集成 | 生产环境 |
日志分析 | ELK/Grafana Loki | 结构化日志检索+异常模式识别 | 全周期 |
混沌工程 | ChaosBlade | 故障注入测试 | 预发环境 |
容器化诊断 | kubectl-debug | 无侵入进入容器调试 | Kubernetes环境 |
五、典型问题排查路线
场景1:CPU利用率100%
top -Hp PID
定位高CPU线程jstack PID | grep -A20 <nid>
分析线程栈- Arthas
profiler start
采样火焰图
场景2:内存泄漏
jmap -dump:format=b,file=heap.bin PID
导出堆快照- MAT分析支配树/GCRoot路径
- Arthas
vmtool
动态监控对象增长
场景3:线程阻塞
jstack PID | grep "BLOCKED"
- 使用Arthas
thread -b
查找死锁 - 结合APM工具分析上下游阻塞链
工具链选择建议
环境类型 | 推荐工具组合 | 优势特性 |
---|---|---|
本地开发 | IDEA Debugger + VisualVM | 快速断点/可视化分析 |
测试环境 | Arthas + JProfiler | 深度诊断/性能基线建立 |
生产环境 | APM + Async-Profiler + 日志平台 | 低侵入/实时监控 |
K8s环境 | kubectl-debug + 容器内Arthas | 无需SSH/快速接入诊断 |