DEV Community

myougaTheAxo
myougaTheAxo

Posted on • Originally published at zenn.dev

Claude CodeでNode.jsメモリリークを検出する:heapdump・clinic.js・V8フレームグラフ

CLAUDE.mdルール

Node.jsのメモリリーク調査では、計測ツールを適切に組み合わせることが重要です。本記事ではClaude Codeを活用した調査ワークフローを紹介します。

# CLAUDE.md
## メモリリーク調査ルール
- heapdumpは本番相当の負荷後に取得する
- clinic.jsのflameグラフでCPUホットスポットを特定する
- V8フレームグラフは--prof + node --prof-processで生成する
- 差分heapスナップショットで増加オブジェクトを絞り込む
Enter fullscreen mode Exit fullscreen mode

heapdumpでスナップショットを取得する

まずはheapdumpパッケージを使ってヒープスナップショットを取得します。

import heapdump from "heapdump";
import http from "http";

heapdump.writeSnapshot("/tmp/heap-baseline.heapsnapshot", (err, filename) => {
  if (err) console.error(err);
  else console.log("Baseline snapshot:", filename);
});

setTimeout(() => {
  heapdump.writeSnapshot("/tmp/heap-after-load.heapsnapshot", (err, filename) => {
    if (err) console.error(err);
    else console.log("After-load snapshot:", filename);
  });
}, 60000);

const server = http.createServer((req, res) => {
  (global as any).leaked = (global as any).leaked ?? [];
  (global as any).leaked.push(Buffer.alloc(1024));
  res.end("ok");
});
server.listen(3000);
Enter fullscreen mode Exit fullscreen mode

clinic.jsでフレームグラフを生成する

clinic flameコマンドでCPUプロファイルを可視化します。

npm install -g clinic
clinic flame -- node --max-old-space-size=512 dist/server.js
clinic doctor -- node dist/server.js
Enter fullscreen mode Exit fullscreen mode

V8フレームグラフとClaude Codeの組み合わせ

Node.jsビルトインのプロファイラを使った手法です。

export function memoryMonitor(intervalMs = 5000) {
  return setInterval(() => {
    const mem = process.memoryUsage();
    console.log(JSON.stringify({
      timestamp: new Date().toISOString(),
      heapUsed: Math.round(mem.heapUsed / 1024 / 1024) + "MB",
      heapTotal: Math.round(mem.heapTotal / 1024 / 1024) + "MB",
      rss: Math.round(mem.rss / 1024 / 1024) + "MB",
    }));
  }, intervalMs);
}

app.use((req, res, next) => {
  const before = process.memoryUsage().heapUsed;
  res.on("finish", () => {
    const delta = process.memoryUsage().heapUsed - before;
    if (delta > 1024 * 1024) {
      console.warn("[MemoryWarn] " + req.method + " " + req.path + " +" + Math.round(delta/1024) + "KB");
    }
  });
  next();
});
Enter fullscreen mode Exit fullscreen mode

まとめ

  • heapdumpでベースライン/負荷後のスナップショットを比較し、増加しているオブジェクトタイプを特定できる
  • clinic.jsのflameグラフでCPUホットスポットを視覚的に把握し、ボトルネック関数を素早く発見できる
  • V8 --profフラグとprocess.memoryUsage()の組み合わせで、リクエスト単位のメモリ増加を定量化できる
  • Claude Codeに差分スナップショットやプロファイルテキストを渡すことで、修正コードの自動生成まで一貫して対応できる

コードの品質を上げたい方へ:Code Review Pack(¥980) — Claude Code用コードレビュープロンプト集。バグ検出・パフォーマンス改善・セキュリティチェックを自動化。

Top comments (0)