メモリリーク 【memory leak】 メモリーリーク
概要
メモリリーク(memory leak)とは、コンピュータで実行中のプログラムが確保したメモリ領域の解放を忘れたまま放置してしまい、利用可能な空き領域が失われる現象。動作の不具合を招くバグ(欠陥)の一種。コンピュータプログラムは実行時にデータ記録などのために必要なメインメモリ(RAM)領域を空き領域から動的に確保し、占有することがよくある。自分用に確保した領域は、役割を終えて不要になったら解放する手続きを行い、空き領域に戻す必要がある。
プログラムの単純な記述ミスや処理の流れの論理的な誤りなどにより解放処理を怠ると、すでに利用されていないのに占有したまま他のプログラムや用途に使うことができない領域が出現する。このような現象をメモリリークという。
メモリリークによる悪影響
メモリリークが頻発するとメモリの空き領域が減少し、実行中のプログラムが必要なメモリ領域を確保できる停止・異常終了したり、コンピュータ自体が動作を停止することがある。仮想メモリを使用している場合には、空き領域が減少することによりストレージとメモリの内容を交換するスワップ動作が増え、処理に長い時間がかかったり動作が停止したりする(スラッシング現象)。
現代では、プログラムが実行時に必要とするメモリ領域はオペレーティングシステム(OS)が管理する領域から割り当てを受けるのが一般的であるため、プログラムを終了すれば占有していたメモリもすべて返還され、リークも解消される。
しかし、サーバソフトウェアや常駐プログラムなど長期間実行状態を維持するプログラムや、高頻度でメモリの確保・解放を繰り返すプログラムの場合、リークにより次第に空き領域が圧迫されることがある。また、OS自体のバグによりメモリリークが発生すると再起動以外に回復する術がない。
対応策
オブジェクト指向言語では、インスタンスの初期化時に資源の確保を行い、破棄時に解放を行う「RAII」(Resource Acquisition Is Initialization)という原則に基づいてコードを記述することでメモリリークを防止しやすくなるとされる。インスタンスの初期化(コンストラクタ呼び出し)とメモリの確保を、インスタンスの破棄(デストラクタ呼び出し)とメモリ解放を結びつけて、インスタンスが生成されたスコープを抜けると自動的に破棄と解放が行われるようにする。
プログラミング言語によっては、実行時に用いられる処理系(実行環境)の機能として、参照されなくなったメモリ領域を自動的に解放する「ガベージコレクション」(garbage collection)が提供されることがある。これにより、プログラマが明示的に解放処理のコードを記述しなくても、使用されなくなった領域をある程度自動的に判別して解放することができる。