メモリーリーク
読み:メモリーリーク
外語:memory leak
メモリー漏れ。
アプリケーション
が、実行中や終了時に、取得したメモリーを正しく開放していないために利用されないメモリーがシステム上に残り、システムのメモリーが不足してしまう現象。
目次
概要
特徴
古いプログラミング言語
最近のプログラミング言語
発生後
システムの問題
概要
プログラム
では、必要に応じて都度、必要な量のメモリーを確保して用いている。
この領域は、使用後に自主的に開放せねばならないが、バグなどの原因によりこれが行なわれず、確保されたまま残ることがある。これがメモリーリークである。
メモリーリークを起こさないためには、プログラムの流れなどを念入りに調べて行かなければならないが、予期せぬ流れが発生した場合の処理で、メモリーリークが起きやすいようである。
特徴
古いプログラミング言語
C
や
C++
といったプログラミング言語は、プログラマーがメモリーの確保と開放を管理せねばならない。
Cなら
malloc
等で確保し、使用後はfree()せねばならない。この処理は言語ではなく、
標準ライブラリ
の処理である。
C++では言語に機能が備わった。必要時に
new
で確保する
delete
で明示的に開放することができるほか、関数など有効範囲を抜けた際に暗示的に開放される。この機能により、メモリーリークによる問題は、多少は起こりづらくなっている。
最近のプログラミング言語
近年の「モダンな」言語では、メモリー解放を言語の処理系に任せる
ガベージコレクション
が導入され、メモリーリークによる問題は、起こりづらくなっている。
元々は
Lisp
などの
プログラミング言語
に備わった機能で、8ビットパソコン用の
BASIC
にすら搭載されていた。今ではCやその姉妹言語、そして
FORTRAN
などを除く殆どの言語に搭載されている。
最近の言語では
Java
、
C#
などがあるが、Javaは特に徹底しており、オブジェクトを自発的に開放する機能(C++やC#で言うところのdelete)を持っていない。
発生後
正しく実装された
オペレーティングシステム
(OS)ならば、アプリケーションが使用しているメモリーはアプリケーション終了時に自動的にシステムに返却されるため、アプリケーションのメモリーリークならば問題のアプリケーションを終了(自主的、強制的問わず)すると解消されるはずである。
しかし、発生してしまうと対処法はシステムの再起動以外に殆ど無いのが実情であり、
サーバー管理者
の頭を悩ませる問題の一つでもある。
さらにメモリーリークの程度にもよるが、発見される程の大きな現象に至るまでに、そのアプリが数千回以上実行されなければならないなど再現性の悪いものも多く、その潜伏期間は半年〜1年にもおよぶ場合があり、問題箇所の発見が非常に難しいという難問もある。
システムの問題
Windows 9x系では、システム上の問題で似たような現象が発生することがあった。
再検索