GC クラス

定義

未使用メモリを自動的に収集するサービスであるシステム ガベージ コレクターを制御します。

public ref class GC abstract sealed
public ref class GC sealed
public static class GC
public sealed class GC
type GC = class
Public Class GC
Public NotInheritable Class GC
継承
GC

次の例では、いくつかの GC メソッドを使用して、使用されていないオブジェクトのブロックに関する生成とメモリ情報を取得し、コンソールに出力します。 その後、未使用の オブジェクトが収集され、結果として得られるメモリ合計が表示されます。

using namespace System;
const long maxGarbage = 1000;
ref class MyGCCollectClass
{
public:
   void MakeSomeGarbage()
   {
      Version^ vt;
      for ( int i = 0; i < maxGarbage; i++ )
      {
         
         // Create objects and release them to fill up memory
         // with unused objects.
         vt = gcnew Version;

      }
   }

};

int main()
{
   MyGCCollectClass^ myGCCol = gcnew MyGCCollectClass;
   
   // Determine the maximum number of generations the system
   // garbage collector currently supports.
   Console::WriteLine( "The highest generation is {0}", GC::MaxGeneration );
   myGCCol->MakeSomeGarbage();
   
   // Determine which generation myGCCol object is stored in.
   Console::WriteLine( "Generation: {0}", GC::GetGeneration( myGCCol ) );
   
   // Determine the best available approximation of the number
   // of bytes currently allocated in managed memory.
   Console::WriteLine( "Total Memory: {0}", GC::GetTotalMemory( false ) );
   
   // Perform a collection of generation 0 only.
   GC::Collect( 0 );
   
   // Determine which generation myGCCol object is stored in.
   Console::WriteLine( "Generation: {0}", GC::GetGeneration( myGCCol ) );
   Console::WriteLine( "Total Memory: {0}", GC::GetTotalMemory( false ) );
   
   // Perform a collection of all generations up to and including 2.
   GC::Collect( 2 );
   
   // Determine which generation myGCCol object is stored in.
   Console::WriteLine( "Generation: {0}", GC::GetGeneration( myGCCol ) );
   Console::WriteLine( "Total Memory: {0}", GC::GetTotalMemory( false ) );
}
using System;

namespace GCCollectIntExample
{
    class MyGCCollectClass
    {
        private const long maxGarbage = 1000;

        static void Main()
        {
            MyGCCollectClass myGCCol = new MyGCCollectClass();

            // Determine the maximum number of generations the system
        // garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

            myGCCol.MakeSomeGarbage();

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            // Determine the best available approximation of the number
        // of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of generation 0 only.
            GC.Collect(0);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of all generations up to and including 2.
            GC.Collect(2);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            Console.Read();
        }

        void MakeSomeGarbage()
        {
            Version vt;

            for(int i = 0; i < maxGarbage; i++)
            {
                // Create objects and release them to fill up memory
        // with unused objects.
                vt = new Version();
            }
        }
    }
}
Namespace GCCollectInt_Example
    Class MyGCCollectClass
        Private maxGarbage As Long = 10000

        Public Shared Sub Main()
            Dim myGCCol As New MyGCCollectClass

            'Determine the maximum number of generations the system
            'garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration)

            myGCCol.MakeSomeGarbage()

            'Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))

            'Determine the best available approximation of the number 
            'of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))

            'Perform a collection of generation 0 only.
            GC.Collect(0)

            'Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))

            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))

            'Perform a collection of all generations up to and including 2.
            GC.Collect(2)

            'Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))
            Console.Read()

        End Sub


        Sub MakeSomeGarbage()
            Dim vt As Version

            Dim i As Integer
            For i = 0 To maxGarbage - 1
                'Create objects and release them to fill up memory
                'with unused objects.
                vt = New Version
            Next i
        End Sub
    End Class
End Namespace

注釈

ガベージ コレクターは、マネージド メモリの割り当てと解放を制御する共通言語ランタイム コンポーネントです。 このクラスのメソッドは、ガベージ コレクションがオブジェクトに対して実行される場合と、オブジェクトによって割り当てられたリソースが解放される場合に影響します。 このクラスのプロパティは、システムで使用可能なメモリの総量と、オブジェクトに割り当てられたメモリの年齢カテゴリ (世代) に関する情報を提供します。

ガベージ コレクターは、マネージド メモリに割り当てられたオブジェクトを追跡して再利用します。 ガベージ コレクターは定期的にガベージ コレクションを実行して、有効な参照がないオブジェクトに割り当てられたメモリを解放します。 ガベージ コレクションは、使用可能な空きメモリを使用してメモリの要求を満たできない場合に自動的に行われます。 または、 メソッドを使用して、アプリケーションでガベージ コレクションを強制 Collect できます。

ガベージ コレクションは、次の手順で構成されます。

  1. ガベージ コレクターは、マネージド コードで参照されているマネージド オブジェクトを検索します。

  2. ガベージ コレクターは、参照されていないオブジェクトの最終処理を試みる。

  3. ガベージ コレクターは、参照されていないオブジェクトを解放し、そのメモリを解放します。

このトピックのセクションは次のとおりです。

ガベージ コレクターとアンマネージ リソース
オブジェクトのエージングと世代
ガベージ コレクションを禁止する

ガベージ コレクターとアンマネージ リソース

コレクション中に、マネージド コード内でオブジェクトへの参照が 1 つ以上見つからた場合、ガベージ コレクターはオブジェクトを解放します。 ただし、ガベージ コレクターはアンマネージ コードからのオブジェクトへの参照を認識しません。明示的に回避されない限り、アンマネージ コードで排他的に使用されているオブジェクトを解放できます。 メソッドは、アンマネージ コードでまだ使用されているオブジェクトをガベージ コレクターが収集 KeepAlive できないメカニズムを提供します。

マネージド メモリの割り当てとは別に、ガベージ コレクターの実装では、ファイル ハンドルやデータベース接続など、オブジェクトによって保持されているリソースに関する情報は保持されません。 型のインスタンスが再利用される前に解放する必要があるアンマネージ リソースを型で使用する場合、型はファイナライザーを実装できます。

ほとんどの場合、ファイナライザーは メソッドをオーバーライドすることで実装されます。ただし、C# または C++ で記述された型ではデストラクターが実装され、コンパイラは のオーバーライドに変換 Object.Finalize されます Object.Finalize 。 ほとんどの場合、オブジェクトにファイナライザーがある場合、ガベージ コレクターはオブジェクトを解放する前に、それを呼び出します。 ただし、ガベージ コレクターは、すべての状況でファイナライザーを呼び出す必要はありません。たとえば、 メソッド SuppressFinalize を使用すると、オブジェクトのファイナライザーが明示的に呼び出されません。 また、ガベージ コレクターは、特定のスレッドを使用してオブジェクトを終了したり、互いに参照しているがガベージ コレクションで使用できるオブジェクトに対してファイナライザーが呼び出される順序を保証する必要はありません。

特定の時点でリソースを解放する必要があるシナリオでは、クラスは インターフェイスを実装できます。このインターフェイスには、リソース管理タスクとクリーンアップ タスクを実行する IDisposable IDisposable.Dispose メソッドが含まれます。 を実装するクラスは、クラス のコンシューマーが メソッドを呼び出してオブジェクトをクリーンアップする場合に、クラス コントラクトの一部として を指定 Dispose する必要があります。 ガベージ コレクターは、既定では メソッドを呼び出しません。ただし、 メソッドの実装では、 クラスのメソッドを呼び出して、ガベージ コレクターの最終処理動作を Dispose Dispose GC カスタマイズできます。

オブジェクトの最終処理と破棄パターンの詳細については、「アンマネージド リソースのクリーンアップ 」を参照してください

オブジェクトのエージングと世代

共通言語ランタイムのガベージ コレクターは、世代を使用したオブジェクトのエージングをサポートしています。 ジェネレーションは、メモリ内のオブジェクトの相対的な年齢を測定する単位です。 オブジェクトの世代番号 (age) は、オブジェクトが属する世代を示します。 最近作成されたオブジェクトは新しい世代の一部であり、アプリケーションのライフ サイクルで以前に作成されたオブジェクトよりも世代番号が小さいです。 最新世代のオブジェクトはジェネレーション 0 です。 ガベージ コレクターのこの実装では、世代 0、1、および 2 の 3 つの世代のオブジェクトがサポートされています。 プロパティの値を取得して、 MaxGeneration システムでサポートされる最大世代番号を決定できます。

オブジェクトのエージングを使用すると、アプリケーションは、ガベージ コレクターがすべての世代を評価する必要ではなく、特定の世代のセットでガベージ コレクションをターゲットにできます。 パラメーターを含む メソッドのオーバーロードを使用すると、ガベージ コレクションする最も古い Collect generation 世代を指定できます。

ガベージ コレクションを禁止する

.NET Framework 4.6 より、ガベージ コレクターは、ガベージ コレクションがアプリのパフォーマンスに悪影響を与える可能性があるクリティカル パスの実行中に使用できる、GC 領域なし待機時間モードをサポートしています。 GC 領域なし待機時間モードでは、ガベージ コレクターからの干渉なしに割り当て可能なメモリの量を指定する必要があります。 ランタイムがメモリを割り当てできる場合、クリティカル パス内のコードの実行中にランタイムはガベージ コレクションを実行されません。

のオーバーロードの 1 つを呼び出すことによって、NO GC 領域のクリティカル パスの先頭を定義します TryStartNoGCRegion 。 クリティカル パスの末尾を指定するには、 メソッドを呼び出 EndNoGCRegion します。

メソッドの呼び出しを入れ子にすることはできません。また、ランタイムが現在 GC リージョンの待機時間モードがない場合にのみ、 メソッドを呼び TryStartNoGCRegion EndNoGCRegion 出す必要があります。 つまり、 を複数回呼び出さ (最初のメソッド呼び出しの後、後続の呼び出しは成功しません) を行う必要があります。また、 の最初の呼び出しが成功したからといって、 の呼び出しが成功するとは思う必要があります TryStartNoGCRegion EndNoGCRegion TryStartNoGCRegion

プロパティ

MaxGeneration

システムが現在サポートしている最大のジェネレーション番号を取得します。

メソッド

AddMemoryPressure(Int64)

アンマネージ メモリが大規模に割り当てられたため、ガベージ コレクションをスケジュールするときに考慮する必要があることが、ランタイムに通知されます。

AllocateArray<T>(Int32, Boolean)

配列を割り当てる。

AllocateUninitializedArray<T>(Int32, Boolean)

可能な場合は、ゼロ初期化のスキップ中に配列を割り当てます。

CancelFullGCNotification()

ガベージ コレクションの通知の登録をキャンセルします。

Collect()

すべてのジェネレーションのガベージ コレクションを直ちに強制実行します。

Collect(Int32)

ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを直ちに強制実行します。

Collect(Int32, GCCollectionMode)

GCCollectionMode 値によって指定したタイミングで、ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを強制的に実行します。

Collect(Int32, GCCollectionMode, Boolean)

ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを、 GCCollectionMode 値で指定したタイミングで強制実行します。コレクションをブロックする必要があるかどうかを指定する値を指定します。

Collect(Int32, GCCollectionMode, Boolean, Boolean)

ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを、 GCCollectionMode 値で指定したタイミングで強制実行します。コレクションをブロックおよび圧縮する必要があるかどうかを指定する値を指定します。

CollectionCount(Int32)

指定したジェネレーションのオブジェクトに対するガベージ コレクションの発生回数を返します。

EndNoGCRegion()

GC 領域の無待機モードを終了します。

GetAllocatedBytesForCurrentThread()

その有効期間の開始以降、現在のスレッドに割り当てられた総バイト数を取得します。

GetGCMemoryInfo()

ガベージ コレクションのメモリ情報を取得します。

GetGCMemoryInfo(GCKind)

ガベージ コレクションのメモリ情報を取得します。

GetGeneration(Object)

指定したオブジェクトの現在のジェネレーション番号を返します。

GetGeneration(WeakReference)

指定した弱い参照の対象となる現在のジェネレーション番号を返します。

GetTotalAllocatedBytes(Boolean)

プロセスの有効期間にわたって割り当てられたバイト数を取得します。 戻り値には、ネイティブの割り当ては含まれません。

GetTotalMemory(Boolean)

現在割り当てられていると思われるバイト数を取得します。 パラメーターは、このメソッドが制御を戻す前に短い時間だけ待機して、システムがガベージ コレクションを行い、オブジェクトの終了操作を実行できるようにするかどうかを示します。

KeepAlive(Object)

指定したオブジェクトを参照することにより、現在のルーチンの開始時からこのメソッドが呼び出される時点までの間、そのオブジェクトをガベージ コレクションの対象から外します。

RegisterForFullGCNotification(Int32, Int32)

フル ガベージ コレクションの可能性が高い状態のとき、およびガベージ コレクションが完了したときに、ガベージ コレクションの通知を発行する必要があることを指定します。

RemoveMemoryPressure(Int64)

アンマネージ メモリが解放され、ガベージ コレクションのスケジュールにこのメモリを考慮する必要がなくなったことをランタイムに通知します。

ReRegisterForFinalize(Object)

SuppressFinalize(Object) が事前に呼び出されている指定オブジェクトに対して、ファイナライザーを呼び出すことをシステムに要求します。

SuppressFinalize(Object)

指定したオブジェクトに対してファイナライザーを呼び出さないよう共通言語ランタイムに要求します。

TryStartNoGCRegion(Int64)

指定した量のメモリを使用可能な場合、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。

TryStartNoGCRegion(Int64, Boolean)

指定した量のメモリを使用可能な場合は、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。また、最初に十分な量のメモリを使用できない場合に、ガベージ コレクターがフル ブロッキング ガベージ コレクションを実行するかどうかを制御します。

TryStartNoGCRegion(Int64, Int64)

大きなオブジェクト ヒープおよび小さなオブジェクト ヒープに対して、指定した量のメモリを使用可能な場合、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。

TryStartNoGCRegion(Int64, Int64, Boolean)

大きなオブジェクト ヒープおよび小さなオブジェクト ヒープに対して、指定した量のメモリを使用可能な場合は、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。また、最初に十分な量のメモリを使用できない場合に、ガベージ コレクターがフル ブロッキング ガベージ コレクションを実行するかどうかを制御します。

WaitForFullGCApproach()

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが近づいているかどうかを確認するための、登録済みの通知の状態を返します。

WaitForFullGCApproach(Int32)

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが近づいているかどうかを確認するための登録済みの通知の状態を、指定したタイムアウト時間で返します。

WaitForFullGCComplete()

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが完了したかどうかを確認するための、登録済みの通知の状態を返します。

WaitForFullGCComplete(Int32)

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが完了したかどうかを確認するための登録済みの通知の状態を、指定したタイムアウト時間で返します。

WaitForPendingFinalizers()

ファイナライザーのキューを処理するスレッドがそのキューを空にするまで、現在のスレッドを中断します。

適用対象

こちらもご覧ください