ガベージコレクタ(GC)はゴミ収集車をイメージしましょう。
garbage collector の直訳は「ゴミを収集する人」ですからそのままですね。
ゴミの廃棄ルール
- ゴミとして捨てるものはゴミ捨て場に置きましょう。ゴミ収集車が集めて持って行ってくれます。
いらなくなったオブジェクトは解放しましょう。GC が発生したタイミングで回収してくれます。GC をいつ発生させるかはランタイムが制御しています。プログラムコードで GC を発生させることもできますが、そうしなくてもよいように実装するのがベターです。
- ゴミ捨て場に置くときにはルールを守りましょう。曜日を守る。分別する。廃棄シールを貼るなど。ルールを守らない場合、収集してくれません。
IDisposable インターフェースを実装する型(ざっくり言うと Dispose メソッドが定義されている型)の場合、Dispose メソッドを呼び出しておきましょう。Dispose メソッドを呼び出しておかないと肝心の中身が回収されずにメモリリークが発生します。回収させたいオブジェクトを格納しているフィールドには null をセットして参照をクリアしましょう。参照されているオブジェクトは「まだ必要」と判断されて回収が遅れます。
- 一度に多くのゴミが捨てられると、ゴミ収集車が来るまでの間、ゴミ捨て場がゴミで溢れかえります。
オブジェクトを生成しては捨て、生成しては捨てを短時間で繰り返すと、使用メモリサイズは増加します。Dispose メソッドを呼び出したり参照をクリアしたりした瞬間にメモリが解放されるわけではありません。GC が発生して回収されたタイミングで使用メモリサイズが減少します。
- 3R(Reduce ゴミを減らす/Reuse 再利用/Recycle 資源リサイクル)が大切です。
3R(Reduce 必要のないオブジェクトを無駄に生成しない/Reuse 何度も使用するオブジェクトは最初に生成して保持して使いまわす/Recycle いらなくなったオブジェクトは適切に解放してメモリをOSに返す)のが大切です。キャッシュすべきか必要に応じて生成すべきかなど、これらは相反します。要件に応じてどうするのが良いかを考え、どうしてそう考えたかをドキュメントなどに残しましょう。そしてレビューしてもらいましょう。