trsing’s diary

勉強、読んだ本、仕事で調べたこととかのメモ。

EFFECTIVE C# 6.0/7.0 読書メモ 項目11

11 .NETのリソース管理を理解する

優れた開発者となるには、実行環境におけるメモリやその他主要なリソースの管理方法を理解する必要がある。.NETの場合、メモリ管理やガーベジコレクタを理解すること。

ガベージコレクタ
マネージヒープにおけるメモリを管理する。メモリリーク、参照されていない未開放のポインタ、未初期化ポインタ、その他多くのメモリ管理における問題のほとんどを扱う。このためメモリリークやポインタ関連の問題もはや開発者の責任ではない。
※その他のシステムリソース(非マネージリソース)に対しては開発者自身が後処理を実装する

ガベージコレクタはアプリケーション内で生存中のオブジェクトからエンティティが到達可能かを把握でき、到達不可能なオブジェクトをガベージとみなす。ガベージコレクタが実行されるたびに使用されなくなったメモリ(ガベージ)を解放し、オブジェクトの再配置を行ってメモリの集約及び未使用メモリの領域の最大化を行う。

非マネージリソースの管理
開発者が責任を負う。非マネージリソース生存期間を開発者が制御できるようにするメカニズム、ファイナライザとIDisposableインターフェイスを用いる。ファイナライザには多くの欠点があるため、IDisposableインターフェイスも併せて実装するとよい。

・ファイナライザ
ファイナライザは、非マネージリソースが最終的には解放されるということを保証するための方法。オブジェクトがガベージとなった後、不特定のタイミングでガベージコレクタによって呼び出される。
※タイミングが不特定のため、なるべくファイナライザに頼らないような設計あるいはコーディングを行うべき。

・ファイナライザによるパフォーマンスの低下
ファイナライザを使用すると解放されるのが遅くなるため、世代が上がり、長命なオブジェクトとみなされてさらに余計に生存することになる。 この問題を回避するためにはIDisposableインターフェイスと一般的なDisposeパターンを使用するとよい。