文章

Java 故障诊断

🔧 常见 Java 故障诊断工具一览

工具 用途场景 优势
jstack 线程阻塞、死锁、CPU高 快速抓线程栈
jmap 内存分析、dump堆、对象数量统计 提供堆快照、对象分布信息
jstat GC 行为监控、内存分布 适合监控 JVM 内部状态
jinfo 查看 JVM 参数 实时查看 VM options
jconsole 图形化监控 JVM 运行状态 快速接入远程进程
VisualVM 图形化综合工具,内存、线程、GC 全面监控 插件丰富,支持远程监控
Arthas 全能型诊断神器(推荐) 热更新、方法跟踪、内存/GC分析
async-profiler / perf-map-agent 性能火焰图、CPU 分析 低开销采样分析,生成火焰图
YourKit / JProfiler 商业级性能分析器 精细调试、调用关系图

🚀 推荐组合使用(按问题场景)

线程死锁 / 阻塞

  • jstack:抓线程堆栈

  • jconsole / VisualVM:查看线程实时状态

  • Arthasthread 命令:查看指定线程详情,支持按 CPU 排序

CPU 占用高

  • top + ps -Lp + jstack:找高 CPU 线程栈

  • Arthasdashboard / profiler / trace:定位热点方法

  • async-profiler:采样生成火焰图,找瓶颈代码

内存泄漏 / OOM

  • jmap -dump:live:生成堆快照

  • jmap -histo:统计对象数量

  • MAT / VisualVM:分析 .hprof 堆文件

  • Arthas heapdump:在线 dump 运行堆,排查问题类

频繁 GC / FullGC

  • jstat -gcutil:实时监控 GC 状态

  • jmap -heap:分析内存使用分布

  • Arthas dashboard:GC、堆区、线程一图掌握


🔹 jstack:线程堆栈分析工具

  • 用途场景:死锁排查、线程阻塞、CPU 占用高

  • 优势:轻量级、无侵入

  • 使用方法

    jstack <pid> > thread.txt
    
  • 典型分析

    • BLOCKED 状态排阻塞

    • Found one Java-level deadlock 定死锁

    • 可配合 top + ps -Lp <pid> 查高 CPU 线程


🔹 jmap:堆和对象分析工具

  • 用途场景:内存泄漏、OOM 排查

  • 优势:可生成堆 dump、对象统计

  • 常用命令

    命令 说明
    jmap -histo:live <pid> 活跃对象数量排名
    jmap -dump:live,format=b,file=heap.hprof <pid> 导出堆快照(用于 MAT 分析)
    jmap -heap <pid> 显示堆内存结构与 GC 配置

🔹 jstat:JVM 状态监控工具

  • 用途场景:GC 频繁、内存变化监控

  • 优势:不影响运行、适合线上观察

  • 常用命令

    jstat -gc <pid> 1000 10
    

    每 1 秒刷新一次,共打印 10 次 GC 状态(包括 Eden/S0/S1/Old 区使用率、YGC/FGC 次数)


🔹 jinfo:JVM 参数查看工具

  • 用途场景:检查启动参数、开启诊断功能

  • 优势:实时查看、可动态修改部分参数

  • 常用命令

    jinfo -flags <pid>          # 查看 JVM 参数
    jinfo -sysprops <pid>       # 查看系统属性
    
  • 用法示例: 开启 JIT 编译日志输出(少用):

    jinfo -flag +PrintCompilation <pid>
    

🔹 jconsole:图形化 JVM 监控工具

  • 用途场景:实时查看线程、内存、GC、MBean

  • 优势:自带 GUI 工具,远程连接方便

  • 启动方法

    jconsole
    
  • 常用功能

    • 实时堆内存图

    • GC 活动图

    • 活跃线程监控

    • 远程连接 JMX 端口(需配置)


🔹 VisualVM:功能全面的图形化工具(比 jconsole 强)

  • 用途场景:内存分析、线程分析、CPU 采样、Dump 分析

  • 优势:插件丰富,界面直观,支持远程

  • 安装

  • 功能

    • 实时查看线程/堆内存

    • 分析 .hprof 文件

    • 安装 Visual GC 插件实时看各区内存变动

    • 分析 CPU 热点方法调用栈(类似火焰图)


🔹 Arthas:全能线上诊断神器(推荐)

  • 用途场景:排查慢请求、动态查看类、方法调用链、内存、线程等

  • 优势:无需重启,热插拔,线上神器

  • 安装与启动

    curl -O https://arthas.aliyun.com/arthas-boot.jar
    java -jar arthas-boot.jar
    
  • 常用命令

    命令 说明
    dashboard 总览内存、GC、线程、TPS
    thread -n 5 查看最忙线程
    watch com.xxx.Class method '{params, returnObj}' 方法参数/返回值观察
    trace com.xxx.Class method 跟踪调用链耗时
    heapdump 在线导出堆文件
    ognl 执行 OGNL 表达式,访问对象内容
  • 特色功能

    • jad 反编译正在运行的类

    • monitor 统计方法调用次数、耗时

    • sc 查看已加载类信息

License:  CC BY 4.0