メモリリーク
出典: フリー百科事典『ウィキペディア(Wikipedia)』
メモリリーク (Memory leak)とは、プログラミングにおけるバグの一種で、プログラムが確保したメモリの一部、または全部を元に戻すのを忘れ、確保したままになってしまうことを言う。たいていの場合、プログラマによる単純な忘れやプログラムの論理的欠陥によって発生することが多い。
なお、プログラミング言語によってはメモリ開放をコンピューターに委ねるガベージコレクションが取り入れられており、メモリリークが起きないようになっている。ガベージコレクションを言語組込みの機能として持つ言語には、LispやJava、C#などがある。
一方でCのようなガベージコレクションが組み込まれていないプログラミング言語では、メモリリークが起きないように注意深くプログラムを設計する必要がある。C++においてはガベージコレクションこそないものの、デストラクタや所有権などの機能・概念により、メモリリークの防止が半自動で可能であり、これはリソースリーク(後述)にも適用できる。
目次 |
[編集] メモリリークの影響
メモリリークは単独で発生する場合、深刻な影響をもたらすことはない。しかし、プログラム内のループ部分など繰り返し実行される部分でメモリリークが発生すると、大量にメモリが消費される。その結果、他のプログラムやOSが確保可能なメモリが少なくなり、以下の2つの現象が発生する。
- OSやプログラムがメモリを確保する際にRAMからのみ確保する場合、エラーを引き起こす、または即座に停止する。
- OSやプログラムがメモリをRAMからだけでなく、ハードディスク上の仮想メモリ上からも確保できる場合(最近のOSはこのタイプ)、RAM上の残りメモリが少なくなるにつれ、これらの動作が遅くなるという現象を引き起こし、全てのメモリを使い終わるとエラーを引き起こす、または即座に停止する。
[編集] メモリリークの誤診断
しばしば、メモリを大量に消費する症状のみを見て、プログラムがメモリリークを起こしていると誤診断されることがある。
一般的にメモリリークを診断するためには、プログラムの論理構造を調べる、デバッガを使って内部状態を確認するなどの手段をとる必要がある。なぜなら、そのプログラムが本当にメモリを大量に必要としていたり、将来必要という理由で確保している可能性があるからである。単に無駄遣いしているだけという場合もある。後者の場合は、プログラムのバグではあるがメモリリークではない。
また、メモリを開放しているはずなのにプログラムの使用メモリが減らない現象を見て、メモリリークが疑われる場合がある。 実は、ほとんどのプログラムはメモリの確保・開放処理をライブラリ経由 (C言語の malloc 関数など) で行っている。プログラムが開放したメモリは、再度の確保の為にライブラリがプールするため、OSから見えるメモリの使用量が減らないように見えているのである。
[編集] リソースリーク
リソースリーク (Resource leak)とはメモリリークを、ファイルやネットワーク接続、OS、ハードウェアなど一般のリソースに拡張した概念である。
例えば、一般的なOS環境でファイルへの読み書きする場合、最初にファイルを開く処理が必要であり、これはメモリでいえば確保する処理にあたる。ファイルへの処理が終了時には、ファイルを閉じて変更内容を反映させる処理が必要であり、これはメモリを開放する処理にあたる。このとき、閉じる処理を忘れて、不要なファイルがいつまでも開いた状態にあれば、リソースリークが発生したことになる。
ファイルを排他的に開いていれば、ユーザーがそのプログラムの処理終了を確認して他のプログラムで開こうとしたときに、原因不明のエラーに悩まされることになる。(ほとんどの場合、リソースリークを起こしたプログラムが終了すれば、OSによって正常な状態に復帰される)
[編集] 関連項目
カテゴリ: バグ | OSのメモリ管理 | コンピュータ関連のスタブ項目