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 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();
            }
        }
    }
}
open System

let maxGarbage = 1000

type MyGCCollectClass() =
    member _.MakeSomeGarbage() =
        for _ = 1 to maxGarbage do
            // Create objects and release them to fill up memory with unused objects.
            Version() |> ignore

[<EntryPoint>]
let main _ =
    let myGCCol = MyGCCollectClass()

    // Determine the maximum number of generations the system
    // garbage collector currently supports.
    printfn $"The highest generation is {GC.MaxGeneration}"

    myGCCol.MakeSomeGarbage()

    // Determine which generation myGCCol object is stored in.
    printfn $"Generation: {GC.GetGeneration myGCCol}"

    // Determine the best available approximation of the number
    // of bytes currently allocated in managed memory.
    printfn $"Total Memory: {GC.GetTotalMemory false}"

    // Perform a collection of generation 0 only.
    GC.Collect 0

    // Determine which generation myGCCol object is stored in.
    printfn $"Generation: {GC.GetGeneration myGCCol}"

    printfn $"Total Memory: {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.
    printfn $"Generation: {GC.GetGeneration myGCCol}"
    printfn $"Total Memory: {GC.GetTotalMemory false}"

    0
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

注釈

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

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

ガベージ コレクションは、以下のステップで構成されています。

  1. ガベージ コレクターは、マネージド コードで参照されているマネージド オブジェクトを検索します。
  2. ガベージ コレクターは、参照されていないオブジェクトの最終処理を試みます。
  3. ガベージ コレクターは、参照されていないオブジェクトを解放し、メモリを再利用します。

管理されていないリソース

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

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

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

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

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

物体の老化と世代

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

アプリケーションはオブジェクトの世代管理により、すべての世代をガベージコレクションの対象とする必要はなく、特定の世代のセットに限定してガベージコレクションを行うことができます。 Collect メソッドの中で generation パラメーターを含むオーバーロードを使用することにより、ガベージ コレクションする最も古い世代を指定できます。

ガベージ コレクションの禁止

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

TryStartNoGCRegionのいずれかのオーバーロードを呼び出して、NO GC 領域のクリティカル パスの先頭を定義します。 EndNoGCRegion メソッドを呼び出して、クリティカル パスの末尾を指定します。

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

プロパティ

名前 説明
MaxGeneration

システムが現在サポートしている世代の最大数を取得します。

メソッド

名前 説明
AddMemoryPressure(Int64)

ガベージ コレクションをスケジュールするときに考慮する必要があるアンマネージ メモリの大きな割り当てをランタイムに通知します。

AllocateArray<T>(Int32, Boolean)

配列を割り当てます。

AllocateUninitializedArray<T>(Int32, Boolean)

可能であれば、ゼロ初期化をスキップしながら配列を割り当てます。

CancelFullGCNotification()

ガベージ コレクション通知の登録を取り消します。

Collect()

すべての世代の即時ガベージ コレクションを強制します。

Collect(Int32, GCCollectionMode, Boolean, Boolean)

ジェネレーション 0 から指定した世代までのガベージ コレクションを、 GCCollectionMode 値で指定された時点で強制的に生成し、コレクションをブロックおよび圧縮するかどうかを指定する値を指定します。

Collect(Int32, GCCollectionMode, Boolean)

ジェネレーション 0 から指定したジェネレーションまでのガベージ コレクションを、 GCCollectionMode 値で指定された時点で強制的に実行し、コレクションをブロックするかどうかを指定する値を指定します。

Collect(Int32, GCCollectionMode)

GCCollectionMode値で指定された時点で、ジェネレーション 0 から指定した世代までのガベージ コレクションを強制的に実行します。

Collect(Int32)

ジェネレーション 0 から指定した世代までの即時ガベージ コレクションを強制します。

CollectionCount(Int32)

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

EndNoGCRegion()

GC リージョン待機時間なしモードを終了します。

GetAllocatedBytesForCurrentThread()

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

GetConfigurationVariables()

ガベージ コレクターによって使用される構成を取得します。

GetGCMemoryInfo()

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

GetGCMemoryInfo(GCKind)

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

GetGeneration(Object)

指定したオブジェクトの現在の世代番号を返します。

GetGeneration(WeakReference)

指定した弱参照のターゲットの現在の生成番号を返します。

GetTotalAllocatedBytes(Boolean)

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

GetTotalMemory(Boolean)

断片化を除くヒープ サイズを取得します。 たとえば、合計 GC ヒープ サイズが 100 mb で、断片化 (つまり、空きオブジェクトによって占有される領域) が 40 mb を占める場合、この API は 60 mb を報告します。 パラメーターは、システムがガベージ コレクションを実行してオブジェクトを最終処理できるように、このメソッドが戻る前に短い間隔で待機できるかどうかを示します。

GetTotalPauseDuration()

プロセスの開始以降に GC で一時停止された合計時間を取得します。

KeepAlive(Object)

指定したオブジェクトを参照します。これにより、現在のルーチンの先頭からこのメソッドが呼び出される時点までのガベージ コレクションに不適格になります。

RefreshMemoryLimit()

システム上のさまざまなメモリ制限を検出して自身を再構成するようにガベージ コレクターに指示します。

RegisterForFullGCNotification(Int32, Int32)

条件が完全ガベージ コレクションを優先する場合、およびコレクションが完了したときに、ガベージ コレクション通知を発生させる必要があることを指定します。

RegisterNoGCRegionCallback(Int64, Action)

一定量のメモリが NO GC リージョンに割り当てられたときに呼び出されるコールバックを登録します。

RemoveMemoryPressure(Int64)

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

ReRegisterForFinalize(Object)

SuppressFinalize(Object)が以前に呼び出された指定したオブジェクトのファイナライザーをシステムが呼び出す要求。

SuppressFinalize(Object)

共通言語ランタイムが、指定したオブジェクトのファイナライザーを呼び出さないことを要求します。

TryStartNoGCRegion(Int64, Boolean)

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

TryStartNoGCRegion(Int64, Int64, Boolean)

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

TryStartNoGCRegion(Int64, Int64)

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

TryStartNoGCRegion(Int64)

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

WaitForFullGCApproach()

共通言語ランタイムによる完全なブロッキング ガベージ コレクションが差し迫っているかどうかを判断するための登録済み通知の状態を返します。

WaitForFullGCApproach(Int32)

指定されたタイムアウト期間に、共通言語ランタイムによる完全なブロッキング ガベージ コレクションが差し迫っているかどうかを判断するための登録済み通知の状態を返します。

WaitForFullGCApproach(TimeSpan)

指定されたタイムアウト期間に、共通言語ランタイムによる完全なブロッキング ガベージ コレクションが差し迫っているかどうかを判断するための登録済み通知の状態を返します。

WaitForFullGCComplete()

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

WaitForFullGCComplete(Int32)

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

WaitForFullGCComplete(TimeSpan)

ブロッキング ガベージ コレクションが完了したかどうかに関する登録済み通知の状態を返します。 完全なコレクションを無期限に待機できます。

WaitForPendingFinalizers()

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

適用対象

こちらもご覧ください