JavaScript | WeakMap / WeakSet の動作(GCで自動削除)を視覚化

javascrpit JavaScript
スポンサーリンク

以下は、WeakMapを使って画像キャッシュを安全に扱うデモです。
一度読み込んだ画像をWeakMapに一時保存し、参照がなくなった画像は自動的にGC(ガベージコレクション)される仕組みをシミュレーションします。

コンセプト

  • Map はキーを強参照する → メモリに残り続ける
  • WeakMap はキーを弱参照 → 参照が切れると自動的に削除される

See the Pen WeakMap Image Cache Demo by MONO365 -Color your days- (@monoqlo365) on CodePen.

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>WeakMap 画像キャッシュデモ</title>
<style>
  body { font-family: sans-serif; padding: 1em; }
  img { width: 100px; margin: 5px; border-radius: 8px; box-shadow: 0 0 4px #ccc; }
  .log { margin-top: 1em; background: #f9f9f9; padding: 10px; border-radius: 8px; }
</style>
</head>
<body>
<h2>WeakMap で画像キャッシュを管理</h2>

<button id="load">画像を読み込み</button>
<button id="release">参照を切る(GC対象に)</button>
<div id="preview"></div>
<div class="log" id="log"></div>

<script>
const cache = new WeakMap();  // 弱参照キャッシュ
let currentImage = null;      // 現在の参照(保持中)

function log(msg) {
  const el = document.getElementById('log');
  el.innerHTML += msg + "<br>";
}

document.getElementById('load').onclick = () => {
  const img = new Image();
  img.src = "https://placekitten.com/150/150?" + Math.random();
  img.onload = () => {
    document.getElementById('preview').innerHTML = "";
    document.getElementById('preview').appendChild(img);
    cache.set(img, "キャッシュ済み");
    currentImage = img;
    log("✅ 画像を読み込み → WeakMap にキャッシュしました");
  };
};

document.getElementById('release').onclick = () => {
  if (currentImage) {
    document.getElementById('preview').innerHTML = "";
    log("🧹 画像の参照を切りました。GCで自動的に解放されます。");
    currentImage = null;
  } else {
    log("(すでに参照なし)");
  }
};
</script>
</body>
</html>
HTML

動作イメージ

  1. 「画像を読み込み」 ボタンを押すと
    → 画像が生成され、WeakMap にキャッシュされる。
  2. 「参照を切る」 を押すと
    → JS上の参照がなくなり、GCのタイミングでWeakMapからも削除される。

(実際のGC発生はブラウザが自動で行うため、即時確認はできません。)

学習ポイント

  • WeakMapのキーはオブジェクトのみ
  • 参照が切れると自動削除されるため、
    → 「画像キャッシュ」「DOM要素関連データ」などに最適。
  • メモリリーク防止に有効。
タイトルとURLをコピーしました