KDOC 625: WeakMapはGCを妨げない

この文書のステータス

  • 作成
    • 2026-09-18 貴島
  • レビュー
    • 2026-09-18 貴島

概要

WeakMapは、値がキーを参照している場合でも、キーとなるオブジェクトがガベージコレクションされるのを妨げない方法で、データとオブジェクトを関連付けることができます。

WeakMap - JavaScript | MDN

コードで試す。

node --expose-gc --input-type=module <<'EOF'
const reg = new FinalizationRegistry(label => console.log("GCで回収 ->", label));

// Map: キーを強参照 → 手放しても Map が生きる限り残る
const map = new Map();
let k1 = {};
reg.register(k1, "Map のキー");
map.set(k1, "v");
k1 = null;

// WeakMap: キーを弱参照 → 手放すと回収対象
const wm = new WeakMap();
let k2 = {};
reg.register(k2, "k2あるいは WeakMap のキーの参照先が回収された");
wm.set(k2, "v");
k2 = null;

await new Promise(r => setTimeout(r, 50));
global.gc();
await new Promise(r => setTimeout(r, 50));
console.log("Map.size =", map.size, "-> k1をnullにしてもMapがキーを強参照するので参照先は消えず中身も残る");
EOF
GCで回収 -> k2あるいは WeakMap のキーの参照先が回収された
Map.size = 1 -> k1をnullにしてもMapがキーを強参照するので参照先は消えず中身も残る

流れ。

Map

変数 --strong--> 実体 <--strong-- Map Key

null            実体 <--strong-- Map Key

                GC

残る             残る             残る
WeakMap

変数 --strong--> 実体 <--weak-- WeakMap Key | slot --strong--> WeakMap Value

null            実体 <--weak-- WeakMap Key | slot --strong--> WeakMap Value

                GC

(なし)           回収             (なし)                           (なし)

なので、キャッシュやメタデータを保存するのに便利である。

関連

なし。

Backlinks