.NETCore-ガベージコレクション
この章では、.NETマネージコードプラットフォームの最も重要な機能の1つであるガベージコレクションの概念について説明します。ガベージコレクタ(GC)は、メモリの割り当てと解放を管理します。ガベージコレクタは、自動メモリマネージャとして機能します。
メモリを割り当てて解放する方法や、そのメモリを使用するオブジェクトの存続期間を管理する方法を知る必要はありません。
「new」キーワードを使用してオブジェクトを宣言するか、値タイプがボックス化されるたびに、割り当てが行われます。通常、割り当ては非常に高速です
オブジェクトを割り当てるのに十分なメモリがない場合、GCはガベージメモリを収集して破棄し、メモリを新しい割り当てに使用できるようにする必要があります。
このプロセスは、 garbage collection。
ガベージコレクションの利点
ガベージコレクションには次の利点があります-
アプリケーションの開発中に手動でメモリを解放する必要はありません。
また、マネージヒープにオブジェクトを効率的に割り当てます。
オブジェクトが使用されなくなると、メモリをクリアしてそれらのオブジェクトを再利用し、将来の割り当てに使用できるようにメモリを保持します。
管理対象オブジェクトは、最初から自動的にクリーンなコンテンツを取得するため、コンストラクターがすべてのデータフィールドを初期化する必要はありません。
また、オブジェクトが別のオブジェクトのコンテンツを使用できないようにすることで、メモリの安全性も提供します。
ガベージコレクションの条件
ガベージコレクションは、次のいずれかの条件が当てはまる場合に発生します。
システムの物理メモリが少なくなっています。
管理対象ヒープに割り当てられたオブジェクトによって使用されるメモリが、許容可能なしきい値を超えています。このしきい値は、プロセスの実行時に継続的に調整されます。
ザ・ GC.Collectメソッドが呼び出され、ガベージコレクターが継続的に実行されるため、ほとんどの場合、このメソッドを呼び出す必要はありません。この方法は、主に固有の状況とテストに使用されます。
世代
.NETガベージコレクタには3つの世代があり、各世代には、割り当てられたオブジェクトのストレージに使用される独自のヒープがあります。ほとんどのオブジェクトは短命または長命であるという基本原則があります。
ジェネレーションファースト(0)
ジェネレーション0では、オブジェクトが最初に割り当てられます。
この世代では、オブジェクトは、次のガベージコレクションが発生するまでに使用されなくなった(スコープ外)ため、多くの場合、最初の世代を超えて存続しません。
ジェネレーション0は、関連するヒープが小さいため、すばやく収集できます。
ジェネレーションセカンド(1)
第1世代では、オブジェクトには2番目のチャンススペースがあります。
寿命は短いが、第0世代のコレクション(多くの場合、偶然のタイミングに基づく)を生き残ったオブジェクトは、第1世代に移動します。
関連するヒープも小さいため、第1世代のコレクションも高速です。
オブジェクトが収集されるか、次世代ヒープにプロモートされるため、最初の2つのヒープは小さいままです。
ジェネレーションサード(2)
第2世代では、すべての長いオブジェクトが存続し、そのヒープが非常に大きくなる可能性があります。
この世代のオブジェクトは長期間存続することができ、オブジェクトをさらに促進する次世代のヒープはありません。
ガベージコレクタには、ラージオブジェクトヒープ(LOH)と呼ばれるラージオブジェクト用の追加のヒープがあります。
85,000バイト以上のオブジェクト用に予約されています。
ラージオブジェクトは世代別ヒープに割り当てられませんが、LOHに直接割り当てられます
第2世代およびLOHコレクションは、長時間実行されたプログラムや大量のデータを処理するプログラムでは、かなりの時間がかかる場合があります。
大規模なサーバープログラムは、数十GBのヒープを持つことが知られています。
GCは、プログラムの実行をブロックする時間を短縮するためにさまざまな手法を採用しています。
主なアプローチは、プログラムの実行を妨げない方法で、バックグラウンドスレッドで可能な限り多くのガベージコレクション作業を行うことです。
GCは、開発者がその動作に影響を与えるためのいくつかの方法も公開します。これは、パフォーマンスを向上させるのに非常に役立ちます。