【めもりりーく】

メモリリーク とは?

💡 メモリが「水漏れ」のように消えていく
📌 このページのポイント
メモリリークの仕組み ヒープ使用量 時間経過 最大メモリ 使用中メモリ 未解放オブジェクト Out of Memory! 解放されない 蓄積
メモリリークの仕組み
ひよこ ひよこ

GCがあってもメモリリークは起きるの?

ペンギン先生 ペンギン先生

起きるよ。GCは「参照されなくなったオブジェクト」を回収するけど、参照が残っていたら回収できない。例えばグローバルな配列オブジェクトをpushし続けて削除しないと、GCから見れば「まだ使ってる」と判断される。イベントリスナーの解除忘れやsetIntervalの未クリアも定番のリーク原因だよ

ひよこ ひよこ

どうやって見つけるの?

ペンギン先生 ペンギン先生

①メモリ使用量を監視して「右肩上がり」なら疑う、②Chrome DevToolsのMemoryタブでヒープスナップショットを取得、③Node.jsなら--inspect付きで起動してメモリプロファイリング、④Java/GoならpProf等のプロファイラ。2つの時点のスナップショットを比較して、増えているオブジェクトが犯人だよ

ひよこ ひよこ

Reactでのメモリリークは?

ペンギン先生 ペンギン先生

useEffectのクリーンアップ関数を書き忘れるパターンが多い。タイマーやWebSocket接続、イベントリスナーをuseEffectで設定したら、return文でクリーンアップを書く。コンポーネントがアンマウントされた後にsetStateを呼ぶのも「メモリリーク警告」の原因になるよ

ひよこ ひよこ

メモリリークの予防策は?

ペンギン先生 ペンギン先生

①WeakMap/WeakSetを使う(弱参照でGC対象になる)、②addEventListenerには必ずremoveEventListenerを対にする、③setInterval/setTimeoutは必ずclear系で解除、④キャッシュにはTTLや上限サイズを設定、⑤長時間稼働するサービスは定期的にメモリ使用量をモニタリング。予防が最大の対策だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「メモリリーク」って出てきたら「メモリが解放されず使用量が増え続けるバグ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Memory Leak」 = メモリ漏れ
💬 Leak(漏れ)。水道の水漏れのようにメモリがジワジワ失われていくよ
← 用語集にもどる