怎么利用 JDK 内置的 SA (Serviceability Agent) 工具深入剖析正在运行的 JVM 进程物理内存镜像

千浩同学_4587

千浩同学_4587

2026-04-23

939人浏览

原创

JDK 8 是唯一能稳定使用 sa-jdi 和 hsdb 直接剖析运行中 JVM 物理内存镜像的主流版本;JDK 9+ 已移除 sa-jdi,jhsdb 功能受限,无法替代其底层内存遍历能力。

怎么利用 jdk 内置的 sa (serviceability agent) 工具深入剖析正在运行的 jvm 进程物理内存镜像

sa-jdi 已在 JDK 9+ 中被移除,JDK 8 是唯一能稳定使用 Serviceability Agent(SA)直接剖析正在运行的 JVM 进程物理内存镜像的主流版本;JDK 11/17/21 等后续版本必须改用 jhsdb,且功能受限、不支持所有 SA 原有能力。


确认目标 JVM 是否允许 SA 附加(JDK 8 必须显式解锁)

SA 在 JDK 8u72 及之后默认禁用,即使进程在运行,hsdb 或 jstack -F 也会报 sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process。

  • 启动 JVM 时需至少加上:-XX:+UnlockDiagnosticVMOptions -XX:+EnableDynamicAgentLoading
  • 若仍失败,补充 -XX:+StartAttachListener(部分 Linux 发行版内核限制 attach)
  • 验证是否生效:运行 jinfo -flag +StartAttachListener ,输出应为 +StartAttachListener 而非 -StartAttachListener
  • 注意:SA 附加会暂停目标 JVM(halted),但不执行任何目标进程内的代码——这是安全前提

用 jstack -F -m 查看实时混合栈(Java + native)

这是最轻量、最常用的 SA 入口,无需图形界面,适合快速定位卡死或崩溃前一刻的状态。

  • 命令格式:jstack -J-d64 -F -m (-J-d64 对 x86_64 必须;-F 强制附加;-m 显示 C/C++ 栈帧)
  • 常见错误:Unable to open socket file → 检查 /tmp/.java_pid 是否存在且可读(权限/SELinux/seccomp 可能拦截)
  • 若输出中 Java 线程显示 java.lang.Thread.State: RUNNABLE 但 native 栈停在 pthread_cond_wait 或 epoll_wait,大概率是线程阻塞在系统调用,不是 JVM 层死锁
  • 对比 jstack (无 -F)输出:若后者能正常返回而前者失败,说明 attach 机制被禁用或权限不足

用 hsdb 图形界面直读 JVM 物理内存布局(仅 JDK 8)

hsdb 是 SA 提供的唯一能交互式浏览 JVM 原生内存结构的工具,可查看 C++ HotSpot 对象(如 InstanceKlass、CollectedHeap)、OOP 指针、符号表、GC roots 链路等。

科学计算器在线使用工具代码
科学计算器在线使用工具代码

html5 css3制作在线科学计算器ui布局,3D计算器面板,加减乘除数字计算器工具特效。

下载
  • 启动命令:java -cp "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB
  • 菜单操作:File → Attach to Process… → 输入 pid(不是 java 进程名)
  • 关键视图:
    • Inspector:输入地址(如 0x00007f8a1c000000)可反解为 oop 或 Klass 实例
    • Threads:比 jstack 多显示线程本地存储(TLS)、JVM 内部线程(如 VMThread、CompilerThread)
    • Runtime → System Dictionary:查看已加载类的符号引用、instanceKlass 地址、方法计数器
  • 注意:hsdb 无法连接远程进程,且对容器环境(如 Docker 默认关闭 ptrace)天然不友好;docker run --cap-add=SYS_PTRACE 是必要条件

jhsdb 在 JDK 11+ 上只能做有限内存快照,不能替代 SA

JDK 9 引入 jhsdb 作为 SA 的“继任者”,但它本质是基于 JVMTI 和调试接口的封装,**无法直接读取进程物理内存镜像**,也不支持 Inspector 类交互式内存遍历。

  • jhsdb jstack --pid 功能接近 JDK 8 的 jstack -F,但缺失 -m 的完整 native 栈解析能力
  • jhsdb clhsdb(command-line HSDB)提供部分命令,如 printmem、inspect,但多数命令返回 Not yet implemented 或 Operation not supported
  • 真正能拿到“物理内存镜像”的方式只剩:jhsdb jmap --binaryheap --pid (生成 heap.hprof),但这只是堆区快照,不含 Metaspace、CodeCache、线程栈等原生内存
  • 结论:若需分析 CodeCache 溢出、Metaspace 碎片、JNI 全局引用泄漏等底层问题,JDK 8 + hsdb 仍是不可替代的方案

JDK 8 的 sa-jdi 和 hsdb 是目前唯一能穿透 JVM 抽象层、直接观察其 C++ 运行时内存结构的组合;所有更高版本都做了主动削弱——这不是遗漏,而是 OpenJDK 社区对调试接口安全性和维护成本的权衡结果。实际排查时,别浪费时间在 JDK 17 上折腾 hsdb,要么降级到 JDK 8 环境复现,要么转向 perf + async-profiler + gdb 的原生栈联合分析路径。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11937

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9042

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7732

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1264

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1008

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1516

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3129

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20371

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1375

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
DBeaver生态工具dbvr官方手册
DBeaver生态工具dbvr官方手册

共0课时 | 0人学习

Gradle 安全最佳实践
Gradle 安全最佳实践

共0课时 | 0人学习