質問
GCは、管理物を決定するためのポリシーオブジェ私が何をしています。処理は暗黙の案は明示的には私がしています。で誰かに一線のモジュールのすべての三つのものを使用されていないのでしょうか。
解決
GCは、ガベージコレクションです。これは、自動メモリ管理、マネージヒープ上に割り当てられたオブジェクトのハンドルのクリーンアップです。 .NET GCはマークとスイープアルゴリズムを採用しています。ガベージコレクションが発生した場合には、基本的に回復可能なように洗浄されるヒープの一部にすべてのオブジェクトと見なします。そして、それが根をスキャンマーキングプロセスを経ます。即ちそれは、アプリケーションがまだ使用されているオブジェクトを識別します。残りのオブジェクトは、クリーンアップのために資格があることを行っています。ヒープは、クリーンアップの一部として圧縮されてもよいです。
処分とファイナライザ・メソッドは、ののGCによって処理されていないリソースを、清掃のためのオプションを提供両方。例えば。これは、ネイティブのハンドルなどである可能性があります。彼らは、マネージヒープのメモリを再利用とは何の関係もありません。
処分はIDisposable
を実装するタイプに明示的に呼び出す必要があります。それはDispose()
方法自体を介して、またはusing
構造物のいずれかを介して呼び出すことができます。 GCは自動的に廃棄を呼び出すことはありません。
Aファイナライザまたはデストラクタ(言語仕様は、それを呼び出すように)一方が自動的にのいつかの呼び出されます。ファイナライズの方法は、専用のスレッドで順次実行されます。
ファイナライザは、ユーザーがDispose()
を呼び出さない場合は、セーフティネットとして機能することができながら、 Dispose()
は、リソースの確定的なクリーンアップを可能にします。
は、クリーンアップする前に呼び出す必要があります。即ちそれは型のインスタンスにメモリを再利用するために追加の収集が必要になります。型用具ならびにIDisposableをした場合、処分方法を呼び出すことができ、その後、インスタンスがファイナライズからそれ自体を除去することができます。それはファイナライザを持っていなかったかのようにこれは、オブジェクトをクリーンアップすることができます。
あなたはこの掘り下げたい場合は、、私はAのhref = "http://blogs.msdn.com/microsoft_press/archive/2010/01/21/rtm-d-today-clr-via-c- <お勧めしますサードedition.aspx」REL = "noreferrer">ジェフリー・リヒターするによってC位を介してCLR。それは素晴らしい本であり、それがこのすべての血みどろの詳細を説明します(私は細部の数を除外しました)。新しい第3版は、ちょうどリリースされました。
他のヒント
.NETの利点の一つは、ガベージコレクタです。多くの言語では、メモリのすべての部分は任意の割り当てられたメモリは最終的に解放されなければならないdeveloper-によって管理されなければなりません。 .NET(C#)とでは、ガベージコレクタ(GC)を使用するためのメモリを解放するプロセスの世話をします。それはあなたのオブジェクトの使用状況を追跡し、それらがなった後、「無根」。:オブジェクトのメモリが自動的にクリーンアップされ、(すなわち、直接または間接的に、そのオブジェクトへのアプリケーション内で何の言及はありません)。
は廃棄、またはより具体的には、IDisposable
及び廃棄パターンが、GCは別にリソースを処理するために使用されます。一部のリソースは、の様々な理由のために、の明示的にクリーンアップする必要があります。これは、あなたがIDisposable
とのDisposeパターンを実装きれいにこれを処理するために、などのネイティブハンドルを、ラップのリソースを使用して、(。NETは、割り当てられたメモリを認識していません)「ネイティブ」APIを使用しています。
ファイナライズオブジェクトで発生します。これは、提供し、「セーフティネット」に配置されているはずのオブジェクトで、まだであれば少し後の理想よりも、クリーンアップすることができます。ファイナライザを実装することで、あなたは、アンマネージリソースが常に解放されることを保証することができます。
ほとんどのサンプルでの問題は、IDisposableをを使用するには、複数の理由があるということです、そして適切な実装が異なるが、あなたがそれを使用している理由に応じて。たとえば、あなたがまだIDisposableインターを実装する必要にもかかわらず、あなたが直接ネイティブリソースをラップしている場合、あなたはファイナライザを実装する必要がありますが、あなたは他のIDisposableのタイプをカプセル化する場合は、ファイナライザは必要ありません。これに対処するためには、私が説明し、私のブログの上の深さに IDisposableをし、ファイナライズについて書いてきました複数の理由は、あなたが様々な理由でIDisposableを、異なるパターンを使用することになります。
まだ読みたいかを考えているとの決定版の記事IDisposable,finalizers、ガーベッジコレクション、ショーンFarkas' CLR内:掘り込IDisposable.
この記事葉が非常に少ないのです。