# メモリリークとメモリ増大 ## 定義 アプリケーションやカーネルモジュールのメモリ使用量が延々と増えていく問題の原因は、次の2種類のどちらかである。メモリリーク(memory leak)は、メモリがもう使われていないのに開放されないというタイプのソフトウェアのバグであり、ソフトウェアのコードを書き換えたりパッチ・アップグレードを適用したりすると解消される。メモリの成長は、ソフトウェアのメモリ消費としては正常だが、システムにとって望ましいペースよりもはるかに速いペースで増えている状態であり、ソフトウェアの構成変更やアプリケーションのメモリ消費方法の変更で解決される。メモリの成長による問題は間違ってメモリリークと考えられてしまうことがよくあるため、最初に考えるべきことはそのような動作が予想されるかどうかである。アプリケーションがメモリキャッシュを使うように構成されている場合、観測されるメモリ使用量の増加はキャッシュのウォームアップである可能性がある。メモリリークの分析方法はソフトウェアと言語のタイプによって変わり、一部のアロケータはアロケーションの詳細を記録するデバッグモードを提供する。Linux BCCのmemleak(8)はアロケーションを追跡し、一定期間開放されなかったものをコードパスとともに示すが、それがリークなのか正常な成長なのかを見分けることはできないため、コードパスを分析してどちらなのかを判断するのは人間の仕事になる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.4.6) ## 横断的知見 (このセクションは複数ソースの突き合わせで得られる知見を蓄積する。現時点では本概念に触れたソースが1件のため、蓄積を今後の ingest に委ねる。) ## 未解決の問い - キャッシュのウォームアップによる正常なメモリ増大と、実際のメモリリークを、稼働開始直後の短時間の観測だけで機械的に切り分ける定量的な基準(増加率の減衰カーブの形状など)は確立できるか。 - memleak(8)のようなツールのオーバーヘッド(アロケーション頻度が高いと増大する)は、本番環境で常時有効化する運用と、問題発生時のみ有効化する運用のどちらが実務上合理的か。 - ガベージコレクション付き言語(Java、Goなど)でのメモリ増大の切り分けは、本章が前提とするCヒープベースのアロケータ(glibc等)の議論とどこまで共通の枠組みで扱えるか。 ## 関連 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] — 本概念の原典解説(§7.4.6)。 - [[USE メソッド]] — メモリ問題の初期切り分けで併用されるメソドロジ。 - [[詳解 システム・パフォーマンス 第2版]] — 書籍ハブ。 ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.4.6