C#のガベージコレクション

C#にはガベージコレクションという機能があります。
ガベージコレクションはメモリの割り当てと解放を管理していて、開発者が自身でメモリ開放を行う必要を無くしてくれます。
メモリ開放のし忘れはアプリケーションにとって致命的なバグになりますが、そのようなケースを防いでくれる素晴らしい機能です。



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

開発者はガベージコレクションに関してほとんど意識する必要はありません。
特別にソースコートを書くことなく自動的にメモリの管理が行われます。

ガベージコレクションは現在のメモり割り当て状況に基づいてメモリ開放の時期を最適に判断して実行します。
どこからも参照されなくなったオブジェクトはガベージ(ごみ)と判断して、それらに割り当てられていたメモリを解放していきます。

メモリの解放を行った後にはメモリコンパクション(メモリの圧縮)と呼ばれる作業が行われます。
メモリの解放が行われる事でメモリの空きは増えますが、小さな空き区画が散らばって存在するフラグメンテーション(断片化)と呼ばれる状態になってしまいます。
断片化が進むと大きくまとまったメモリの割り当てが行えなくなってしまう為、使用中のオブジェクトのメモリ割り当て位置をずらす事で、小さな隙間を無くしていきます。



ガベージコレクションの強制実行

ほとんどの場合、開発者はガベージコレクションが実行されるタイミングを制御する必要はありません。
但し、特殊な状況やテスト段階ではガベージコレクションを強制的に実行させたい場合もあるかも知れません。

このような時の為に、ガベージコレクションを強制実行する「GC.Collect」というメソッドがあります。



開発者が注意すべき点

C#では開発者が明示的にメモリの解放を行う必要はありません。
ですが、参照されなくなったオブジェクトを解放する仕組みである為、必要が無くなったデータをフィールド(メンバー変数)などで持ち続けているとそのメモリは解放されない事が分かります。

メモリを効率よく利用する為、必要が無くなったオブジェクトはnullをセットしてインスタンスへの参照が無くなるようにしましょう。







コメント