Web教材一覧ハードウェアとソフトウェア

メモリ管理(メモリの確保と解放)


メモリのフラグメンテーション

アプリケーションで必要になったメモリ領域は、そのアプリケーションが終了したとき、単に他のアプリケーションで使える(再利用できる)ようにだけで、その領域が詰められるのではありません。そのため、メモリのの各所にとびとびに空領域が生じます。このような断片化をフラグメンテーションといいます

一方、(仮想記憶方式を無視すれば)アプリケーションで必要とするメモリ領域は連続する領域に配置されます。そのため、メモリ全体としては十分な空き領域があるのに、連続領域が確保できないということが起こります。
 また、不連続領域に配置できる場合でも、処理効率向上のためのキャッシュメモリを効果的に利用するには、連続した領域に配置するのが適切です。

メモリの解放

コンパクション

コンパクションはメモリ内に分散しているフラグメンテーション領域を一か所にまとめる機能です(ディスクでのデフラグに相当する機能です)。
 なお、実務的には、後述のガベージコレクションと連動してコンパクションを行うことが多いことから、両者を合わせてガベージコレクションということもあります。

メモリリーク

本来アプリケーションが動的に占有したメモリ領域は、処理が終了した時点で動的に解放して他のアプリケーションで利用できるようにする必要があります。ところが異常終了など、なんらかの理由で、占有領域が解放しないまま放置されることがあります。それをガベッジ(ごみ)といいます。
 ガベッジがたまると、利用可能なメモリ領域が減少しまいます。それをメモリリークといいます。上述のフラグメンテーションは、再利用可能でOSが管理していますが、メモリリークは(OSではなく)アプリケーション管理下で発生するので、再利用ができません。

(注)リソースリーク

メモリリークの対象を資源全般に拡大した概念です。一般には、アプリケーションが確保したファイルを終了時に解放せずに放置している状態です。これは起こると、他のアプリケーションがこのファイルを使おうとしたとき「他のアプリケーションで使用中です」というようなメッセージが表示されて実行できない状態になります。

ガベージコレクション

自動的にガベッジ領域を収集して強制的に解放してメモリリークを解消する処理をガベージコレクションといいます。

メモリの確保

フラグメンテーションを防ぐには、アプリケーションがメモリを確保するとき、必要容量が小さければ小さな空き領域を、必要容量が大きければ大きな空き領域を選択するような工夫が必要です。それには、OSが管理しているメモリ管理の探索リストを調べるのですが、その効率を高めることも必要です。

ファーストフィット方式
探索リストの最初から順番に探索し、最初に見つけた十分な空き領域を選択する方式です。必要な容量を確保し、残りを空き領域とします。検索の効率はよいのですが、空き領域数が増えます。
ベストフィット方式
探索リスト全体を検索し、必要容量以上で最小容量の領域を選択する方式です。検索効率よりメモリの使用効率を重視する方式ですが、実際には小さな空き領域が増えて使用効率があまり改善されないこともあります。
ワーストフィット方式
ベストフィットでの小さな空き領域発生を回避するために、最大領域を選択して大きな空き領域を残そうとする方式です。
クイックフィット方式
探索リストをサイズ毎に分類した別々のリストで管理する方式です。探索効率はよくなりますが、探索リストの構造が複雑になりますし、探索リストのためのメモリ領域が増大します。

本シリーズの目次へ