Heap Seance について
Heap Seanceは、Javaのメモリーリークを調査する開発者向けのMCPサーバー兼CLIツールキットで、Claude Codeでの利用を想定しています。保守的なスキャンから詳細調査へ段階的に進み、複数の証拠に基づいて確信度を示します。
主な機能
- 01保守的なスキャンから詳細調査へ段階的に移行
- 02クラスヒストグラムとGCデータの収集
- 03JFR記録とヒープダンプの作成
- 04Eclipse MATによるリーク候補の分析
- 05証拠と確信度を統一形式で出力
活用シーン
- 01サービス操作の反復後にオブジェクト増加を確認
- 02GC負荷を伴う増加かどうかを評価
- 03ヒープダンプ内の保持オブジェクトを調査
- 04修正後に再スキャンして変化を確認
MCP 対応
MCPサーバーは、JVMの検出、実行時データの収集、記録とヒープダンプの作成、MATまたはasync-profilerによる分析を行う8つのツールを提供します。Claude Code向けの/leak-scanと/leak-deepコマンドも付属します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Heap Seance
ヒープに保持されたオブジェクトを呼び起こし、消えようとしないものを問いただします。
jcmd、jmap、jstat、jfr、Eclipse MAT、async-profilerの能力を体系的なリーク調査ワークフローに集約するMCP サーバー+CLIツールキットです。Claude Code内での実行を想定して設計されています。
2つのスラッシュコマンド。8つのMCPツール。デフォルトでは保守的に動作します。
仕組み • クイックスタート • MCPツール • ワークフロー • 前提条件 • コントリビュート
仕組み
Heap Seanceは2段階のエスカレーションモデルに従います。証拠が求めない限り、詳細なフォレンジック調査は行いません。
/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には、少なくとも2つの独立した強い兆候が必要です。増加しているクラスが1つだけなら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. Javaプロジェクトに.mcp.jsonを追加する
調査対象のプロジェクトで、.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 の出力:判定、信頼度、主な証拠、疑わしい型、成果物、次のステップ。
/leak-deep では、さらに詳細な情報が得られます:判定、信頼度、ルート保持者の仮説(増加するオブジェクトをどのオブジェクトが、どのフィールド/チェーン経由で保持しているか)、裏付けとなる証拠、成果物、修正の仮説(具体的な修正案)、検証計画。
信頼度の段階
| 信頼度 | 意味 | 必要なシグナル |
|---|---|---|
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 ブロック(推奨)またはシェル変数に設定します:
| 変数 | 必須 | 説明 |
|---|---|---|
JAVA_HOME | 推奨 | JDK 17 以降のインストールパス — jcmd、jmap、jstat、jfr は、まず $JAVA_HOME/bin から検索されます。MAT を適切な Java バージョンで起動する際にも使用されます。 |
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) |
MCP_TRANSPORT の代わりに、CLI フラグ --sse と --streamable-http を使用できます。
設定テンプレートの全体については .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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。