关于 Heap Seance
Heap Seance 是面向 Java 项目的 MCP 服务与 CLI 工具包,供在 Claude Code 中调查内存泄漏的开发者使用。它按证据逐步升级诊断,并根据多种信号给出置信度分级。
主要功能
- 01分阶段执行保守扫描与深度取证
- 02采集类直方图和 GC 数据
- 03生成 JFR 记录与堆转储
- 04通过 Eclipse MAT 分析泄漏嫌疑
- 05输出统一结构的证据与置信度
适用场景
- 01检查服务在重复操作后的对象增长
- 02判断增长是否伴随 GC 压力
- 03分析堆转储中的保留对象
- 04修复后重新扫描验证变化
MCP 相关
MCP 服务提供 8 个工具,用于发现 JVM、采集运行时数据、创建记录和堆转储,并调用 MAT 或 async-profiler 分析。另附供 Claude Code 使用的 /leak-scan 与 /leak-deep 命令。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
堆灵媒
从堆中召唤被保留的对象——审问那些不肯消亡的对象。
一个 MCP 服务 + 命令行工具包,将 jcmd、jmap、jstat、jfr、Eclipse MAT 和 async-profiler 的能力整合到结构化的内存泄漏调查工作流中,专为在 Claude Code 中运行而设计。
2 个斜杠命令。8 个 MCP 工具。默认采用保守策略。
工作原理 • 快速开始 • MCP 工具 • 工作流 • 前置条件 • 参与贡献
工作原理
Heap Seance 采用两阶段升级模型。只有证据表明有必要时,才进行深入取证。
/leak-scan /leak-deep
| |
v v
3x class histogram (all of scan, plus)
+ GC pressure snapshot JFR recording
| heap dump
v MAT leak suspects
monotonic growth? async-profiler alloc profile
old-gen pressure? |
| v
+--- both true? -----> auto-escalate to deep
|
+--- otherwise ------> verdict + next steps
置信度来自证据,而非假设。 high 至少需要两个相互独立的强信号。单个增长的类标记为 watch。增长加上 GC 压力标记为 suspicious。再加入 MAT 支配树或 JFR 关联信息,即可得出 probable_memory_leak。
快速开始
需要 uv、Python 3.10+ 和用于工具的 JDK 17+(目标应用可以运行任何 Java 版本)。
1. 克隆
git clone https://github.com/your-org/heap-seance.git
2. 将 .mcp.json 添加到 Java 项目
在要调查的项目中创建一个 .mcp.json:
{
"mcpServers": {
"heap-seance": {
"command": "uv",
"args": ["run", "--directory", "/path/to/heap-seance", "python", "-m", "heap_seance_mcp.server"],
"env": {
"JAVA_HOME": "/path/to/jdk-17",
"MAT_BIN": "/path/to/ParseHeapDump.sh",
"ASYNC_PROFILER_BIN": "/path/to/asprof"
}
}
}
}
--directory 指向你克隆 Heap Seance 的位置。uv run 会自动处理虚拟环境和依赖项。ASYNC_PROFILER_BIN 为可选项——如果缺失,深度模式会继续使用 JFR + MAT。
3. 复制 Claude Code 命令
将 .claude/commands/ 文件夹复制到你的 Java 项目中,即可使用 /leak-scan 和 /leak-deep 斜杠命令:
cp -r /path/to/heap-seance/.claude/commands/ .claude/commands/
4. 运行
/leak-scan my-service # conservative scan
/leak-deep 12345 # full forensics by PID
Heap Seance 会解析目标进程、收集证据并返回结构化结论。
MCP 工具
| 工具 | 功能 |
|---|---|
java_list_processes() | 通过 jcmd -l 查找正在运行的 JVM |
java_class_histogram(pid) | 按类快照存活对象数量 |
java_gc_snapshot(pid) | 随时间采样 jstat -gcutil |
java_jfr_start(pid) | 捕获 JFR 记录 |
java_jfr_summary(jfr_file) | 汇总 JFR 事件类型和数量 |
java_heap_dump(pid) | 完整堆转储(.hprof) |
java_mat_suspects(heap_dump) | 运行 MAT 泄漏嫌疑分析 |
java_async_alloc_profile(pid) | 通过 async-profiler 生成分配火焰图 |
每个工具都返回相同的统一架构:
{
"status": "ok | warn | error",
"evidence": ["..."],
"metrics": {},
"confidence": "none | low | medium | high",
"next_recommended_action": "...",
"raw_artifact_path": "..."
}
调查工作流
- 启动应用,并让它完成初始化。
/leak-scan <name-or-pid>— 获取第一份直方图快照。- 复现可疑行为 — 扫描会在 3 次直方图采样之间提示你执行怀疑会导致泄漏的操作(打开/关闭视图、发送请求、重复工作流)。这一步至关重要——如果采样之间没有负载,泄漏就不会显现。
- 查看结论。 重点关注
Confidence、Key Evidence、Suspect Types。 - 如果扫描发现增长,或无论如何都想进行完整取证,请运行
/leak-deep <name-or-pid>。 - 修复并重新扫描。 限制缓存大小、使用弱引用、清理监听器——然后再次运行
/leak-scan,确认信号减弱。 - 保留产物。
.jfr、.hprof和 MAT 报告会保存下来,供团队审查。
返回内容
/leak-scan 返回:Verdict、Confidence、Key Evidence、Suspect Types、Artifacts、Next Steps。
/leak-deep 会进行更深入的分析:Verdict、Confidence、Root Holder Hypothesis(哪些对象通过什么字段/链保留了不断增长的对象)、Supporting Evidence、Artifacts、Remediation Hypotheses(具体修复建议)、Verification Plan。
置信度等级
| 置信度 | 含义 | 所需信号 |
|---|---|---|
none | 没有泄漏证据 | — |
low | 增长信号较弱,没有 GC 压力 | 仅直方图 |
medium | 有增长,且 GC 正在承受压力 | 直方图 + GC 压力 |
high | 很可能存在泄漏,且有佐证 | 直方图 + GC + MAT/JFR |
前置条件
工具链 JDK(必需):
jcmd、jmap、jstat需要 JDK 17+ — 通过.mcp.json中的JAVA_HOME设置- 目标应用可使用任意 Java 版本运行(包括 Java 8)
深度取证(用于 /leak-deep):
- Eclipse MAT CLI(
ParseHeapDump.sh/.bat)— 深度模式必需 - async-profiler — 可选的决胜工具
可选工具:
jfrCLI — 如果可用,则用于生成 JFR 摘要;否则使用jcmd JFR.view。对于 Java 8 目标程序(格式不兼容),会完全跳过 JFR。
检查你的设置:
./scripts/check_prereqs.sh # macOS / Linux
scripts\check_prereqs.bat # Windows
环境变量覆盖项
将这些变量设置在 .mcp.json 的 env 块中(推荐),或设置为 Shell 变量:
| 变量 | 必需 | 说明 |
|---|---|---|
JAVA_HOME | 推荐 | JDK 17+ 安装路径 — 查找 jcmd、jmap、jstat、jfr 时会优先搜索 $JAVA_HOME/bin。也用于使用正确的 Java 版本启动 MAT。 |
MAT_BIN | 深度模式必需 | ParseHeapDump.sh(macOS/Linux)或 .bat(Windows)的路径 |
ASYNC_PROFILER_BIN | 可选 | async-profiler 二进制文件路径 — 用作决胜证据;深度模式不依赖它也能运行 |
HEAP_SEANCE_ARTIFACT_DIR | 可选 | .jfr、.hprof 和报告的保存位置(默认:系统临时目录) |
MCP_TRANSPORT | 可选 | 传输协议:stdio(默认)、sse 或 streamable-http |
MCP_HOST | 可选 | SSE/HTTP 传输的绑定地址(默认:0.0.0.0) |
MCP_PORT | 可选 | SSE/HTTP 传输的端口(默认:8000) |
可使用 CLI 标志 --sse 和 --streamable-http 替代 MCP_TRANSPORT。
完整配置模板请参见 .mcp.json.example。
兼容性说明
- Java 8 目标程序:直方图、GC 和 MAT 均可正常使用。会跳过 JFR(v0.9 格式与现代工具不兼容)。
- Windows:MAT 通过
ParseHeapDump.bat运行。async-profiler 为可选项——如果缺失,深度模式仍会继续使用 JFR + MAT。会自动处理jstat输出中因区域设置不同而使用的十进制分隔符(逗号或句点)。 - MAT + JAVA_HOME:MAT 会使用
JAVA_HOME中的 JDK 启动,因此即使系统默认 Java 版本过旧,无法运行 MAT,也不影响使用。
CLI 用法(不使用 Claude Code 时)
uv run heap-seance --mode scan --match your-app
uv run heap-seance --mode deep --pid 12345 --output json
安装 uv
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
手动设置(不使用 uv)
python3 -m venv .venv
source .venv/bin/activate # Windows: .\.venv\Scripts\Activate.ps1
pip install -e .
heap-seance --mode scan --match your-app
python3 -m unittest discover -s tests -p "test_*.py"
用于验证的 Java 示例场景位于 examples/java-scenarios/ 中:真实的泄漏、有界缓存(无泄漏)和突发分配器(无泄漏)。
贡献
欢迎贡献!请参阅 CONTRIBUTING.md,了解添加工具、信号和技能的指南。
许可证
本项目采用双重许可,您可以选择以下任一许可证:
。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。