jhsdb是jdk 9引入的统一故障诊断工具集,替代旧版独立工具,支持运行时attach分析堆、线程、类加载等;需jdk 9+,通过jhsdb --help验证,用jps -l查pid,支持jmap/jstack/jcmd等子命令,安全获取堆快照与线程栈。

jhsdb 是 JDK 9 引入的 JVM 故障诊断工具集,替代了旧版的 jmap、jstack、jinfo 等独立工具,统一通过一个命令入口提供多种诊断能力。它支持在 JVM 进程运行时(无需提前开启特殊参数)连接并分析堆内存、类加载、线程栈、GC 状态等关键信息。
确认 jhsdb 可用性与目标进程 ID
确保使用的是 JDK 9 或更高版本(推荐 JDK 11+),执行 jhsdb --help 验证是否可用。获取待分析 Java 进程 PID 的常用方式:
- 用
jps -l列出本地 Java 进程及其主类全名 - 或用
ps aux | grep java结合端口/参数识别目标进程 - 注意:jhsdb 默认只能 attach 本用户启动的进程;若需 attach 其他用户进程,需 root 权限或目标 JVM 启动时添加
-XX:+StartAttachListener
查看实时堆内存概览与对象统计
使用 jhsdb jmap 子命令获取堆快照和对象分布,避免触发 Full GC(相比老版 jmap -histo 更安全):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
jhsdb jmap --pid <pid> --histo</pid>:输出按实例数排序的类统计(含类名、实例数、总大小) -
jhsdb jmap --pid <pid> --heap</pid>:显示堆配置(初始/最大值)、各代使用情况、GC 算法及当前 GC 状态 -
jhsdb jmap --pid <pid> --dumpfile heap.hprof</pid>:生成标准 HPROF 堆转储文件,可后续用 VisualVM 或 Eclipse MAT 分析
检查类加载器与已加载类详情
排查类重复加载、内存泄漏(如 ClassLoader 泄漏)或类定义变更问题:
-
jhsdb jmap --pid <pid> --clstats</pid>:列出所有类加载器地址、加载类数量、已卸载类数、存活对象数,重点关注非 Bootstrap 类加载器的实例数增长 -
jhsdb jmap --pid <pid> --allheap --dumpfile classes.hprof</pid>:导出包含类元数据的堆镜像(需配合解析工具查看类结构) - 结合
jhsdb jcmd <pid> VM.native_memory summary</pid>可辅助判断 Metaspace 是否异常增长
分析线程状态与锁竞争(关联内存行为)
内存问题常伴随线程阻塞或死锁,用 jhsdb jstack 获取线程快照:
-
jhsdb jstack --pid <pid></pid>:输出所有线程栈,标注线程状态(RUNNABLE / BLOCKED / WAITING)、锁持有/等待关系 -
jhsdb jstack --pid <pid> --mixed</pid>:同时显示 Java 栈和本地栈(C/C++ 调用),适合排查 JNI 引起的内存异常 - 若发现大量线程处于
java.lang.ref.Finalizer或java.lang.ref.Reference$ReferenceHandler状态,可能暗示对象回收压力大,需回溯堆中未释放的引用链
不复杂但容易忽略:jhsdb 默认使用 serviceability agent attach,部分容器环境(如 Docker)或受限 SELinux 系统可能禁用该机制,此时需在启动 Java 应用时显式添加 -XX:+UseContainerSupport -XX:+StartAttachListener 并确保挂载 /proc 可读。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










