【めもりりーく】

メモリリーク とは?

最終更新:
💡 もう使わないデータが、メモリに居残る

不要になったメモリが解放されず、使えるメモリを圧迫する状態。手動の解放漏れだけでなく、ガベージコレクションがある言語でも不要な参照を残すと起こります。

📌 このページのポイント
使い終わったデータが居残る同じ操作を繰り返したあとの例多い繰り返す回数 →● 赤:GC後にも残る量が増える● 緑:不要なデータを回収できるどの参照が持ち続けているか調べよう増えただけではリークと断定できない
GC後にも残るメモリ量の推移の例。グラフは実測値ではありません。データの中身と参照元を調べて原因を確認します。
ひよこ ひよこ
メモリが漏れるって、どこかへ消えるの?
ペンギン先生 ペンギン先生
消えるのではなく、もう必要ないデータが居残るんだ。手動で確保した領域を解放し忘れる場合も、不要なオブジェクトを参照し続ける場合もある。残る量が多いと、処理を重くしたりメモリ不足につながったりするよ。
ひよこ ひよこ
自動で片付けてくれる言語なら、安心?
ペンギン先生 ペンギン先生
JavaScriptのGCは、ルートからたどれるオブジェクトを残す。例えば使い終わったデータをグローバルな配列へため続けると、不要でも回収できないよ。一方、オブジェクト同士が輪になっていても、外からたどれなければ現在のJavaScriptのGCでは回収対象になるんだ。
ひよこ ひよこ
使用量が上がったら、リークなの?
ペンギン先生 ペンギン先生
必要な処理で増えることもあるから、それだけでは決められない。似た操作を繰り返し、GC後にも残る量やオブジェクトを比べよう。Chrome DevToolsのヒープスナップショットでは、何が残り、どの参照が保持しているかを調べられるよ。
ひよこ ひよこ
どう直せばいい?
ペンギン先生 ペンギン先生
使い終わったデータをどこが持っているか調べて、不要な参照を外す。使わなくなったイベントの購読やタイマーも、設計に合わせて終了させよう。WeakMapなどは特定の参照の保持を避ける道具で、どんなリークも一括で解決するものではないよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「メモリリーク」って出てきたら「もう使わないデータがメモリに残り続けること」と思えばだいたいOK!
📖 おまけ:英語の意味
「Memory Leak」 = メモリの漏れ
💬 物理的にメモリが外へ漏れるのではなく、不要な領域を回収できず、ほかの処理に使えるメモリが減る状態を表す比喩です。

参考資料

← 用語集にもどる