メモリリーク

読み:メモリリーク
外語:memory leak
品詞:さ変名詞

メモリ漏れ。アプリケーションが、実行中や終了時に、取得したメモリを正しく開放していないために利用されないメモリがシステム上に残り、システムのメモリが不足してしまう現象。

プログラムでは、必要に応じて都度、必要な量のメモリを確保して用いている。

この領域は、使用後に自主的に開放せねばならないが、バグなどの原因によりこれが行なわれず、確保されたまま残ることがある。これがメモリリークである。

メモリリークを起こさないためには、プログラムの流れなどを念入りに調べて行かなければならないが、予期せぬ流れが発生した場合の処理で、メモリリークが起きやすいようである。

古いプログラミング言語

CC++といったプログラミング言語は、プログラマがメモリの確保と開放を管理せねばならない。

Cならmalloc等で確保し、使用後はfree()せねばならない。この処理は言語ではなく、標準ライブラリの処理である。

C++では言語に機能が備わった。必要時にnewで確保するdeleteで明示的に開放することができるほか、関数など有効範囲を抜けた際に暗示的に開放される。この機能により、メモリリークによる問題は、多少は起こりづらくなっている。

最近のプログラミング言語

近年の「モダンな」言語では、メモリ解放を言語の処理系に任せるガベージコレクションが導入され、メモリリークによる問題は、起こりづらくなっている。

元々はLispなどのプログラム言語に備わった機能で、8ビットパソコン用のBASICにすら搭載されていた。今ではCやその姉妹言語、そしてFORTRANなどを除く殆どの言語に搭載されている。

最近の言語ではJavaC♯などがあるが、Javaは特に徹底しており、オブジェクトを自発的に開放する機能(C++やC♯で言うところのdelete)を持っていない。

正しく実装されたオペレーティングシステム(OS)ならば、アプリケーションが使用しているメモリはアプリケーション終了時に自動的にシステムに返却されるため、アプリケーションのメモリリークならば問題のアプリケーションを終了(自主的、強制的問わず)すると解消されるはずである。

しかし、発生してしまうと対処法はシステムの再起動以外に殆ど無いのが実情であり、サーバ管理者の頭を悩ませる問題の一つでもある。

さらにメモリリークの程度にもよるが、発見される程の大きな現象に至るまでに、そのアプリが数千回以上実行されなければならないなど再現性の悪いものも多く、その潜伏期間は半年〜1年にもおよぶ場合があり、問題箇所の発見が非常に難しいという難問もある。

Windows 9x系では、システム上の問題で似たような現象が発生することがあった。