メモリコンパクション、ガベージコレクションって何だろう?違いを調べよう!

コンピュータシステム

主記憶装置(メインメモリ)には限りがあります。つまり有限なのです!

有限なものを効率的に使うために、コンピュータ上では様々な工夫がされています。

主記憶装置(※以下、メモリと表現)を効率的に使う手法の一つとして、実記憶管理という処理をOSが行っています。

実記憶管理の中でプログラムをメモリにロードするための区画を動的に割り当てることができる「可変区画方式」があります。この方式を使うと、メモリの利用効率がとても向上してハッピーなのですが、ちょっと問題があります。

この問題を解決する手段として「メモリコンパクション」と「ガベージコレクション」という仕組みがあります。言葉からはちょっと想像しにくいので、今回はこの二つの仕組みの特徴と違いを解説していきます!

尚、メモリの区画の話は以下の記事にありますので、お時間ありましたら是非読んでみてください。

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

「可変区画方式」とはプログラムのサイズに合わせた大きさでメモリの区画を分割して、割り当てる方式です。区画のサイズが必要に応じて動的に変わるため、メモリに無駄が発生しません

この可変区画方式は、メモリ上にプログラムを隙間なくロードして、実行させることができるのですが、実行しているプログラムがロードした(詰め込んだ)順番に終了するとは限らないのです。

プログラムが終了するとメモリ上にその分空きが生まれますが、その空きがバラバラにできます。そうすると、メモリの空き容量自体が次にロードしたいプログラムのサイズを満たしていても、連続した空き領域を確報することができません。

このようにメモリの空き領域がロード済みのプログラムの間に飛び飛びになっている現象を「フラグメンテーション(断片化)」と呼びます。

フラグメンテーションのイメージ

この状態が激しいと、メモリが効率的に使えなくなってしまうだけでなく、他のプログラムが実行できなくなる問題を発生してしまいます。

 

メモリコンパクションの仕組みは?

メモリ上のフラグメンテーションの解決方法は二つあります。

その一つがメモリコンパクションです!

「メモリ+コンパクション(圧縮)」なので、メモリ上でプログラムが使っている区画を隙間なく並べ直してあげる処理なのです。

メモリコンパクションのイメージ

メモリコンパクションが実行されると、メモリ上で実行中のプログラムを一時停止して、各区画のプログラムを移動して隙間なく再配置することで、広大な空き領域を作り出すことができます。

この処理によって、大きなプログラムをロードすることができるようになります。

 

ガベージコレクションの仕組みは?

もう一つフラグメンテーションが発生したメモリの空き容量を増やす方法としてガベージコレクション(GC)があります。

メモリコンパクションはメモリ上のプログラムを維持しつつ、再配置することで、そのプログラムを引き続き実行できますが、ガベージコレクションはプログラム自体をメモリ上から解放してしまいます。

ガベージコレクションのイメージ

ガベージコレクション(GC)には「Scavenge GC(スキャベンジ・ジーシー)」と「Full GC(フル・ジーシー)」の二つのパターンがあるようです。(詳しくは「5分で分かるガベージコレクションの仕組み」をご参照ください)

また、コンピュータにおいて、不要になったメモリ領域が解放されず、再利用が不可能な状態が、メモリリークと呼ばれます。OSやアプリケーションでメモリリークが発生すると、メモリ不足に陥ってPCを正常に使用できなくなる場合があります。ガーベジコレクションの機能によって、そのような異常事態を未然に防ぐことができます。

まとめ

今回はメモリ上のフラグメンテーションの対策として、メモリコンパクションとガベージコレクション(GC)の解説をしてきました!

コンピュータを継続的に使うとメモリ上に様々なプログラムをロードすることになりますので、メモリ内部がきちんと整理された状態では無くなってしまいます(フラグメンテーション化)。

この状態を解放するためにメモリコンパクションガベージコレクションがあるのですね。二つともメモリの空き領域を増やす!という点では同じなのですが、一気にバッサリやってしまうガベージコレクションの方が漢気あり過ぎですね。

因みにストレージ(外部記憶装置)上で同じようにファイルや空き領域の記録位置を再編し、細かく分断された領域の断片化を解消する処理のことを「デフラグメンテーション」defragmentation)と呼びますね。これはWindowsはシステム管理ツールで実施することもできますね。

以上です!

タイトルとURLをコピーしました