【めもりりーく】

メモリリーク とは?

最終更新:
💡 メモリが「水漏れ」のように消えていく
📌 このページのポイント
メモリリークの仕組み ヒープ使用量 時間経過 最大メモリ 使用中メモリ 未解放オブジェクト 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(漏れ)。水道の水漏れのようにメモリがジワジワ失われていくよ
← 用語集にもどる