メモリリーク
メモリリークとは
メモリリーク(英:memory leak)とは、プログラムが確保したメモリ領域の一部 または すべてを解放し忘れ、確保したまま放置してしまうことであり、プログラミングにおけるバグの一種です。
通常プログラムは、次の図のように主記憶装置から必要な領域を確保し、役割を終えて不要になったタイミングで確保したメモリ領域を解放し、空き領域に戻します。
しかし、プログラムの記述ミスなどにより解放処理を怠ると、不要になったプログラムがメモリ領域を確保したままになってしまう現象が起こります。この現象がメモリリークです。
メモリリークが頻発すると、メモリの空き領域が減少し、実行中プログラムの動作が遅くなったり、異常終了したりします。
ポイント
- メモリの解放を忘れるとメモリリークが発生する
- メモリリークが発生するとメモリの空き領域が減っていく
ガベージコレクションとは
ガベージコレクションとは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放し、空き領域として再利用できるようにすることです。
従来はプログラマが明示的にメモリの解放を行う必要があったが、ガベージコレクションが組み込まれているプログラミング言語やフレームワークの場合は、実行中のプログラムの動作から不要になったと判断した領域を自動的に解放します。
しかし、不要であると機械的には判断されず(どこからも参照されなくなったものは解放するが、参照が残っている場合は解放されない)なかなか解放されないこともあります。
また、長期間実行状態を維持するプログラムや、高頻度でメモリの確保・解放を繰り返すプログラムでもメモリリークが発生してしまうことがあります。
そのためプログラマは、プログラミング言語によって用意されている解放処理を確認し、リソースの解放を忘れずに行うことが大切です。