Heap Seance 介绍
用途
Heap Seance 是一个 MCP 服务器 + CLI 工具包,用于 Java 应用的内存泄漏调查。它把 jcmd、jmap、jstat、jfr、Eclipse MAT 和 async-profiler 等 JVM 取证工具串联成一个结构化的工作流,旨在运行于 Claude Code 之内,把分散的工具输出整合为统一的泄漏裁决结论。
主要能力
- 提供 2 个斜杠命令(/leak-scan、/leak-deep)与 8 个 MCP 工具。
- 采用两阶段升级模型:保守扫描与深度取证,没有足够证据时不进行深度分析。
- 所有工具返回同一套统一 schema。
- 置信度分级:高危结论需至少两个独立强信号;单个持续增长的类为 watch(观察);增长叠加 GC 压力为 suspicious(可疑);再加入 MAT 支配树或 JFR 关联证据才判定为 probable_memory_leak(很可能内存泄漏)。
- /leak-scan 返回:Verdict(裁决)、Confidence(置信度)、Key Evidence(关键证据)、Suspect Types(可疑类型)、Artifacts(产物)、Next Steps(后续步骤)。
- /leak-deep 额外返回:Root Holder Hypothesis(根持有者假设,即谁通过哪个字段/链条持有增长对象)、Supporting Evidence(支撑证据)、Remediation Hypotheses(具体修复建议)、Verification Plan(验证计划)。
- 保留 .jfr、.hprof 与 MAT 报告等产物,供团队审阅。
使用方式
前置条件:需要 uv、Python 3.10+,以及用于工具链的 JDK 17+(目标应用可运行任意 Java 版本)。
- 在要调查的 Java 项目中创建 .mcp.json,其中 --directory 指向克隆 Heap Seance 的位置;uv run 会自动处理虚拟环境与依赖。ASYNC_PROFILER_BIN 为可选,缺失时深度模式继续使用 JFR + MAT。
- 将 .claude/commands/ 文件夹复制到 Java 项目中,即可使用 /leak-scan 与 /leak-deep 斜杠命令。
- 调查流程:启动应用并让其完成初始化;运行 /leak-scan <name-or-pid> 获取第一份直方图快照;在三次直方图采样之间,按提示执行疑似泄漏的行为(如打开/关闭视图、发送请求、重复工作流)——采样之间没有负载则泄漏不可见;阅读裁决,关注 Confidence、Key Evidence、Suspect Types;如扫描标记增长或希望完整取证,运行 /leak-deep <name-or-pid>;修复后重新扫描确认信号下降。
命令行用法也支持在 Claude Code 之外使用。环境变量可在 .mcp.json 的 env 块中设置,或作为 shell 变量;CLI 标志 --sse 与 --streamable-http 可替代 MCP_TRANSPORT。完整配置模板见 .mcp.json.example。
工具链要求:JDK 17+ 用于 jcmd、jmap、jstat,通过 .mcp.json 中的 JAVA_HOME 设置;目标应用可运行任意 Java 版本(包括 Java 8)。深度取证需要 Eclipse MAT CLI(ParseHeapDump.sh / .bat);async-profiler 为可选决胜工具;jfr CLI 为可选,用于 JFR 摘要(若不可用则回退到 jcmd JFR.view;Java 8 目标因格式不兼容会完全跳过 JFR)。可用命令检查环境配置。
适用场景
- 在 Claude Code 中对 Java 应用进行内存泄漏的初步扫描与深度根因分析。
- 需要可复现、带置信度分级与产物留存的泄漏调查流程。
- 修复后验证信号是否下降。
限制与兼容性
- Java 8 目标:直方图 + GC + MAT 可完整工作;JFR 因 v0.9 格式与现代工具不兼容而被跳过。
- Windows:MAT 通过 ParseHeapDump.bat 工作;async-profiler 可选,缺失时深度模式继续使用 JFR + MAT;jstat 输出中因区域而异的十进制分隔符(逗号与点)会被自动处理。
- MAT + JAVA_HOME:MAT 使用 JAVA_HOME 中的 JDK 启动,因此即使系统默认 Java 过旧也可运行。
- 项目采用双许可:Apache License, Version 2.0。
- 贡献指南见 CONTRIBUTING.md。
- 仓库中还包含用于验证的 Java 示例场景(真实泄漏、有界缓存无泄漏、突发分配器无泄漏)。
代码与安装命令保持原文,未做改动。