ホームページ >バックエンド開発 >C#.Net チュートリアル >.NET ガベージ コレクション (GC) 原理の分析
.NET の高度な内容の一部として、ガベージ コレクター (略して GC) を理解する必要があります。この記事では、「分かりやすさ」の原則に従って、CLR のガベージ コレクターの動作原理を説明します。
まずMSDNの説明を見てみましょう: 新しいプロセスを初期化するとき、ランタイムはプロセス用に連続したアドレス空間領域を予約します。この予約されたアドレス空間はマネージド ヒープと呼ばれます。
「マネージド ヒープもヒープです」、なぜそう言うのですか?この知識ポイントの前提は、「値型と参照型の違い」です。ここでは、読者は「値型はスタックに格納され、参照型はヒープに格納される(参照型の参照はスタックに格納される)」という重要な概念をすでに知っているものとします。したがって、この理論によれば、CLR では、値型を除くすべてのリソースがマネージド ヒープから割り当てられることが必要になります。
マネージド ヒープは、ヒープ内の次のオブジェクトの割り当て場所を指す、ここでは NextObjPtr という名前のポインターを維持します。
キャッシュ (コンピューターのレベル 1、レベル 2、およびレベル 3 キャッシュ)、最後にメモリです。
ルートクラスで定義されたすべてのstaticフィールド、メソッドパラメータ、ローカル変数(参照型変数のみ)などはルートです。また、CPUレジスタ内のオブジェクトポインタもルートです。ルートは、CLR がヒープの外で見つけることができるさまざまなエントリ ポイントです。
第0世代のスペースがいっぱいになると、ガベージコレクターがリサイクルを開始します、到達不能なオブジェクト(CとE)上図)リサイクル後、残ったオブジェクトは第一世代として分類されます。
世代 0 のスペースがいっぱいになり、世代 1 のスペースに到達できないオブジェクトが多くなり始め、スペースがほぼいっぱいになると、両方の世代のゴミがリサイクルされます。存続するオブジェクト (到達可能なオブジェクト) の場合、世代 0 は世代 1 に昇格し、世代 1 は世代 2 に昇格します。
実際の CLR 世代のコレクション メカニズムは、より「インテリジェント」です。新しく作成されたオブジェクトのライフサイクルが短い場合、第 0 世代のガベージはガベージ コレクターによって (スペースが完全に割り当てられるのを待たずに) すぐにリサイクルされます。さらに、世代 0 がリサイクルされ、「到達可能な」オブジェクトがまだ多くあり、
があまりメモリを解放していないことが判明した場合、世代 0 のバジェットは 512KB に増加し、リサイクル効果は次のように変換されます。ガベージ コレクションの数は減りますが、毎回大量のメモリが再利用されます。メモリがあまり解放されていない場合、ガベージ コレクターは
フル コレクション (3 世代) を実行します。それでも十分ではない場合は、「メモリ オーバーフロー」例外がスローされます。
言い換えれば、ガベージ コレクターは、回復されたメモリのサイズに基づいて、各世代の割り当てられたスペース バジェットを動的に調整します。自動最適化を実現!
ガベージ コレクションの背後には基本的な考え方があります: プログラミング言語 (ほとんど) は常に無制限のメモリにアクセスできるように見えます。そして開発者は、魔法のように、無尽蔵に割り当て、割り当て、割り当てを続けることができます。
.NET ガベージ コレクターの基本的な動作原理は、最も基本的なマークと明確な原理によって到達不能なオブジェクトをクリアし、次にディスクのデフラグのように利用可能なメモリを圧縮して整理し、最後に世代別アルゴリズムによってパフォーマンスを最適化します。
以上が.NET ガベージ コレクション (GC) 原理の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。