メモリリーク 【memory leak】 メモリーリーク

概要

メモリリーク(memory leak)とは、コンピュータで実行中のプログラムが確保したメモリ領域の解放を忘れたまま放置してしまい、利用可能な空き領域が失われる現象。動作の不具合を招くバグ(欠陥)の一種。

コンピュータプログラム実行時データ記録などのために必要なメインメモリRAM)領域を空き領域から動的に確保し、占有することがよくある。自分用に確保した領域は、役割を終えて不要になったら解放する手続きをい、空き領域に戻す必要がある。

プログラムの単純な記述ミスや処理の流れの論理的な誤りなどにより解放処理を怠ると、すでに利用されていないのに占有したまま他のプログラムや用途に使うことができない領域が出現する。このような現象をメモリリークという。

メモリリークによる悪影響

メモリリークが頻発するとメモリの空き領域が減少し、実行中のプログラムが必要なメモリ領域を確保できる停止・異常終了したり、コンピュータ自体が動作を停止することがある。仮想メモリを使用している場合には、空き領域が減少することによりストレージメモリの内容を交換するスワップ動作が増え、処理に長い時間がかかったり動作が停止したりする(スラッシング現象)。

現代では、プログラム実行時に必要とするメモリ領域はオペレーティングシステムOS)が管理する領域から割り当てを受けるのが一般的であるため、プログラムを終了すれば占有していたメモリもすべて返還され、リークも解消される。

しかし、サーバソフトウェア常駐プログラムなど長期間実行状態を維持するプログラムや、高頻度でメモリの確保・解放を繰り返すプログラムの場合、リークにより次第に空き領域が圧迫されることがある。また、OS自体のバグによりメモリリークが発生すると再起動以外に回復する術がない。

対応策

オブジェクト指向言語では、インスタンスの初期化時に資源の確保をい、破棄時に解放をう「RAII」(Resource Acquisition Is Initialization)という原則に基づいてコードを記述することでメモリリークを防止しやすくなるとされる。インスタンス初期化コンストラクタ呼び出し)とメモリの確保を、インスタンスの破棄(デストラクタ呼び出し)とメモリ解放を結びつけて、インスタンスが生成されたスコープを抜けると自動的に破棄と解放がわれるようにする。

プログラミング言語によっては、実行時に用いられる処理系実行環境)の機能として、参照されなくなったメモリ領域を自動的に解放する「ガベージコレクション」(garbage collection)が提供されることがある。これにより、プログラマが明示的に解放処理のコードを記述しなくても、使用されなくなった領域をある程度自動的に判別して解放することができる。

(2024.4.1更新)

他の辞典による解説 (外部サイト)

この記事の著者 : (株)インセプト IT用語辞典 e-Words 編集部
1997年8月より「IT用語辞典 e-Words」を執筆・編集しています。累計公開記事数は1万ページ以上、累計サイト訪問者数は1億人以上です。学術論文や官公庁の資料などへも多数の記事が引用・参照されています。
ホーム画面への追加方法
1.ブラウザの 共有ボタンのアイコン 共有ボタンをタップ
2.メニューの「ホーム画面に追加」をタップ
閉じる