アプリケーションで必要になったメモリ領域は、そのアプリケーションが終了したとき、単に他のアプリケーションで使える(再利用できる)ようにだけで、その領域が詰められるのではありません。そのため、メモリのの各所にとびとびに空領域が生じます。このような断片化をフラグメンテーションといいます
一方、(仮想記憶方式を無視すれば)アプリケーションで必要とするメモリ領域は連続する領域に配置されます。そのため、メモリ全体としては十分な空き領域があるのに、連続領域が確保できないということが起こります。
また、不連続領域に配置できる場合でも、処理効率向上のためのキャッシュメモリを効果的に利用するには、連続した領域に配置するのが適切です。
コンパクションはメモリ内に分散しているフラグメンテーション領域を一か所にまとめる機能です(ディスクでのデフラグに相当する機能です)。
なお、実務的には、後述のガベージコレクションと連動してコンパクションを行うことが多いことから、両者を合わせてガベージコレクションということもあります。
本来アプリケーションが動的に占有したメモリ領域は、処理が終了した時点で動的に解放して他のアプリケーションで利用できるようにする必要があります。ところが異常終了など、なんらかの理由で、占有領域が解放しないまま放置されることがあります。それをガベッジ(ごみ)といいます。
ガベッジがたまると、利用可能なメモリ領域が減少しまいます。それをメモリリークといいます。上述のフラグメンテーションは、再利用可能でOSが管理していますが、メモリリークは(OSではなく)アプリケーション管理下で発生するので、再利用ができません。
メモリリークの対象を資源全般に拡大した概念です。一般には、アプリケーションが確保したファイルを終了時に解放せずに放置している状態です。これは起こると、他のアプリケーションがこのファイルを使おうとしたとき「他のアプリケーションで使用中です」というようなメッセージが表示されて実行できない状態になります。
自動的にガベッジ領域を収集して強制的に解放してメモリリークを解消する処理をガベージコレクションといいます。
フラグメンテーションを防ぐには、アプリケーションがメモリを確保するとき、必要容量が小さければ小さな空き領域を、必要容量が大きければ大きな空き領域を選択するような工夫が必要です。それには、OSが管理しているメモリ管理の探索リストを調べるのですが、その効率を高めることも必要です。