まず、GCは何ですか
1、GC)は、一般に、システムが自動的に手動(コレクトを呼び出す必要はありません、オブジェクトや変数がメモリを解放するために使用されることはありません検出します、ガベージコレクタであるので、必須ガベージコレクション、メモリのタイムリーなリリースであり、プログラムがより効率的に。
2、GC:管理対象オブジェクトの回復のための唯一の責任は、非管理対象オブジェクトの回復のための責任を負いません。
スパムとは何ですか?ごみへのフルアクセスは、オブジェクトや値は現在のプログラムの実行後に参照されていないされて何か、ではありません
図は次のとおりです。
コードは以下の通りであります:
使用して、システムを 使用して; System.Collections.Genericを 使用して、System.Linqのを 使用して、System.Textのを 使用して、System.Threading.Tasksを 名前空間TestDemo { パブリック クラスTestDemo { プライベート 静的テストT = 新しい新しいテスト()// 静的とすることができません回収静的ホールド参照が回収されない { イド = 123 、 名前 = 「テスト」 }; 公共 静的 ボイドショー() { ///括弧{}は、実装後の最初のブロックは、GCが解放される一般に活性であるコードブロック手段であり、2つのブロック間影響を与えない /// この理由ので、放出されないOBJ OBJ型変数の参照の静的トラバーサル { オブジェクト OBJ = 新しい新しい {NAME = 1 }; t.obj = OBJ; INT I = 3 ; // GCなり testDemo testDemo = 新しい新しい testDemo(); //はGCであろう } { GC.Collect(); // アクティブGC } } } パブリック クラステスト { 公共 のint Idは{ 取得します。セット; } パブリック 文字列名前{ 得ます。セット; } パブリック オブジェクト OBJ { 得ます。セット; } } }
概要:プログラムがゴミを実行され、これはリリースされていない、まだ静的OBJのトンを使用することです
どのようにそれをリサイクルすることGC?
1、新しいメモリが十分に訪問していないマーキング、見つかったすべてのオブジェクトヒープを通過した後、メモリをクリーンアップするためのスレッドを開始する時間ではありません
2、対象の明確なマーク、移動する他に、そしてきれいに配置するので、この時間全体のスレッドが停止メモリ動作が許可されていない
3を、十分なメモリが臨界値が存在し、メモリオブジェクトを指し、またヒープ全体のサイズです
回復プロセスのGCの実行:
1、最初のGCの前にすべてのオブジェクトは0で
最初のGC後のオブジェクト2、とも呼ばれる保持レベル1
3 0のオブジェクトはスペースが十分でない場合は1に行き、その後、最初に行くために回復レベルオブジェクト、その後、オブジェクトがあるとレベル2となっ
た後、4 0は、十分に十分にレベル1ではないないが、レベル2が十分ではない、メモリのオーバーフロー
5、より最近割り当て、よりリサイクルされる、などオブジェクトを作成するためのforループ
ラージオブジェクトと通常のオブジェクトキャッシュアドレスは同じではありません。
ラージ・オブジェクトの戦略:オブジェクトリスト(断片)を用いて、別々に管理85Kの一定値より大きい場合には、頻繁なメモリの移動を回避します
第二に、デストラクタとIDisposableを差?
〜クラス()デストラクタ:主に、アンマネージリソースを解放するために使用され、自動的に実行に解放GCアンマネージリソースへの待機時間
GCが回復したときにCLR特定の呼び出しが、しかし、遅れて現われることがある(オブジェクトが解放されません知っているどのくらいの時間)
廃棄():解放アンマネージリソースも解放するイニシアチブをとる、方法自体が無意味である、我々は方法のリソースの解放を達成する必要がある
GCが呼び出すことはありませんが、しかし、オブジェクトを使用した場合、ユーザーがこのメソッドを呼び出すためのイニシアチブをとる、に行きますリリースアンマネージリソース、
というよりも、オブジェクトが解放されたとき、それはDisposeメソッドを呼び出し、その後、一度にオブジェクトを使い果たす自動的に移動します、我々はDisposeメソッドを実行するためのイニシアチブをとるには、当然のことながら、ショートカットを使用することができます
次のコード:
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してSystem.Textのを。 使用してSystem.Threading.Tasksを。 名前空間TestDemo { パブリック クラスTestDemoThree { 公共の 静的な 無効ショー() { { のために(int型私= 0 ;私は< 2 ; I ++ ) { TestThree @class = 新しいTestThree() { 同上 = I、 名前 = " TestThree " }; } } { GC.Collect(); // アクティブGCときデストラクタCLR特定の呼び出し } { /// これを使用して試して同等、廃棄を呼び出すために呼び出すことになります最終的に後に 使用(TestThree TestThree = 新しい新しいTestThree() { 同上 = 1 、 名前 = " 444 " }) トライ { // 相当于使っ } 最後に { // 调用的にdispose() } } } パブリック クラスTestThree:IDisposableを { 公共 のint Idを{ 取得します。セット; } パブリック 文字列名前{ 得ます。セット; } 〜TestThree() { Console.WriteLineを($ " 执行{this.GetType()。名前}〜TestThreeDispose " )。 } 公共 ボイドのDispose() { Console.WriteLineを($ " 执行{this.GetType()名前}廃棄してください。" ); } } } }
イニシアチブのGCの実装の結果
結果を使用して