【めもりりーく】
メモリリーク とは?
最終更新:
💡 もう使わないデータが、メモリに居残る
不要になったメモリが解放されず、使えるメモリを圧迫する状態。手動の解放漏れだけでなく、ガベージコレクションがある言語でも不要な参照を残すと起こります。
📌 このページのポイント
- 不要なメモリを解放できずに残してしまう
- 自動回収があっても、届く参照を残すと回収できない
- 使用量の増加だけではなく、残ったデータと参照元を調べる
- 不要な参照や、使い終わった購読・タイマーを整理する
メモリが漏れるって、どこかへ消えるの?
消えるのではなく、もう必要ないデータが居残るんだ。手動で確保した領域を解放し忘れる場合も、不要なオブジェクトを参照し続ける場合もある。残る量が多いと、処理を重くしたりメモリ不足につながったりするよ。
自動で片付けてくれる言語なら、安心?
JavaScriptのGCは、ルートからたどれるオブジェクトを残す。例えば使い終わったデータをグローバルな配列へため続けると、不要でも回収できないよ。一方、オブジェクト同士が輪になっていても、外からたどれなければ現在のJavaScriptのGCでは回収対象になるんだ。
使用量が上がったら、リークなの?
どう直せばいい?
使い終わったデータをどこが持っているか調べて、不要な参照を外す。使わなくなったイベントの購読やタイマーも、設計に合わせて終了させよう。WeakMapなどは特定の参照の保持を避ける道具で、どんなリークも一括で解決するものではないよ。
まとめ:ざっくりこれだけ覚えればOK!
「メモリリーク」って出てきたら「もう使わないデータがメモリに残り続けること」と思えばだいたいOK!
📖 おまけ:英語の意味
「Memory Leak」 = メモリの漏れ
💬 物理的にメモリが外へ漏れるのではなく、不要な領域を回収できず、ほかの処理に使えるメモリが減る状態を表す比喩です。