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