GC クラス

定義

未使用メモリを自動的に収集するサービスであるシステム ガベージ コレクターを制御します。Controls the system garbage collector, a service that automatically reclaims unused memory.

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 メソッドを使用して、未使用のオブジェクトのブロックに関するジェネレーションとメモリの情報を取得し、それをコンソールに出力します。The following example uses several GC methods to get generation and memory information about a block of unused objects and print it to the console. その後、未使用のオブジェクトが収集され、結果として得られるメモリの合計が表示されます。The unused objects are then collected, and the resulting memory totals are displayed.

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

注釈

ガベージコレクターは、マネージメモリの割り当てと解放を制御する共通言語ランタイムコンポーネントです。The garbage collector is a common language runtime component that controls the allocation and release of managed memory. このクラスのメソッドは、オブジェクトに対してガベージコレクションを実行する場合と、オブジェクトによって割り当てられたリソースが解放される場合に影響を及ぼします。The methods in this class influence when garbage collection is performed on an object and when resources allocated by an object are released. このクラスのプロパティは、システムで使用可能なメモリの合計量と、オブジェクトに割り当てられたメモリの経過期間カテゴリ (ジェネレーション) に関する情報を提供します。Properties in this class provide information about the total amount of memory available in the system and the age category, or generation, of memory allocated to an object.

ガベージコレクターは、マネージメモリに割り当てられたオブジェクトを追跡して再利用します。The garbage collector tracks and reclaims objects allocated in managed memory. ガベージコレクターは、ガベージコレクションを定期的に実行して、有効な参照がないオブジェクトに割り当てられたメモリを解放します。Periodically, the garbage collector performs garbage collection to reclaim memory allocated to objects for which there are no valid references. ガベージコレクションは、使用可能な空きメモリを使用してメモリの要求を満たすことができない場合に自動的に発生します。Garbage collection happens automatically when a request for memory cannot be satisfied using available free memory. また、アプリケーションでメソッドを使用してガベージコレクションを強制することもでき Collect ます。Alternatively, an application can force garbage collection using the Collect method.

ガベージコレクションは、次の手順で構成されています。Garbage collection consists of the following steps:

  1. ガベージコレクターは、マネージコードで参照されているマネージオブジェクトを検索します。The garbage collector searches for managed objects that are referenced in managed code.

  2. ガベージコレクターは、参照されていないオブジェクトの最終処理を試みます。The garbage collector tries to finalize objects that are not referenced.

  3. ガベージコレクターは、参照されていないオブジェクトを解放し、そのメモリを解放します。The garbage collector frees objects that are not referenced and reclaims their memory.

このトピックのセクションは次のとおりです。This topic includes the following sections:

ガベージコレクターとアンマネージリソース The garbage collector and unmanaged resources
オブジェクトのエージングと生成 Object aging and generations
ガベージコレクションを禁止Disallowing garbage collection

ガベージコレクターとアンマネージリソースThe garbage collector and unmanaged resources

コレクションでは、マネージコード内でオブジェクトへの参照が1つ以上見つかった場合、ガベージコレクターはオブジェクトを解放しません。During a collection, the garbage collector will not free an object if it finds one or more references to the object in managed code. ただし、ガベージコレクターはアンマネージコードからのオブジェクトへの参照を認識しないため、明示的に禁止されている場合を除き、アンマネージコードで排他的に使用されているオブジェクトが解放される可能性があります。However, the garbage collector does not recognize references to an object from unmanaged code, and might free objects that are being used exclusively in unmanaged code unless explicitly prevented from doing so. メソッドは、 KeepAlive アンマネージコードでまだ使用されているオブジェクトをガベージコレクターが収集しないようにするメカニズムを提供します。The KeepAlive method provides a mechanism that prevents the garbage collector from collecting objects that are still in use in unmanaged code.

マネージメモリの割り当て以外に、ガベージコレクターの実装では、ファイルハンドルやデータベース接続など、オブジェクトによって保持されているリソースに関する情報は保持されません。Aside from managed memory allocations, implementations of the garbage collector do not maintain information about resources held by an object, such as file handles or database connections. 型のインスタンスが解放される前に解放する必要があるアンマネージリソースを型が使用する場合、型はファイナライザーを実装できます。When a type uses unmanaged resources that must be released before instances of the type are reclaimed, the type can implement a finalizer.

ほとんどの場合、ファイナライザーはメソッドをオーバーライドすることによって実装され Object.Finalize ます。ただし、C# または C++ で記述された型はデストラクターを実装し、コンパイラはをオーバーライド Object.Finalize します。In most cases, finalizers are implemented by overriding the Object.Finalize method; however, types written in C# or C++ implement destructors, which compilers turn into an override of Object.Finalize. ほとんどの場合、オブジェクトにファイナライザーがあると、ガベージコレクターは、オブジェクトを解放する前にそのオブジェクトを呼び出します。In most cases, if an object has a finalizer, the garbage collector calls it prior to freeing the object. ただし、ガベージコレクターは、すべての状況でファイナライザーを呼び出す必要はありません。たとえば、メソッドは、 SuppressFinalize オブジェクトのファイナライザーが呼び出されないように明示的に禁止します。However, the garbage collector is not required to call finalizers in all situations; for example, the SuppressFinalize method explicitly prevents an object's finalizer from being called. また、ガベージコレクターは、オブジェクトを終了するために特定のスレッドを使用する必要はありません。また、相互参照するオブジェクトに対してファイナライザーが呼び出される順序を保証しますが、それ以外の場合はガベージコレクションに使用できます。Also, the garbage collector is not required to use a specific thread to finalize objects, or guarantee the order in which finalizers are called for objects that reference each other but are otherwise available for garbage collection.

特定の時間にリソースを解放する必要があるシナリオでは、クラスはインターフェイスを実装できます IDisposable 。このインターフェイスには、 IDisposable.Dispose リソース管理タスクとクリーンアップタスクを実行するメソッドが含まれています。In scenarios where resources must be released at a specific time, classes can implement the IDisposable interface, which contains the IDisposable.Dispose method that performs resource management and cleanup tasks. を実装するクラスでは Dispose 、クラスコントラクトの一部としてを指定する必要があります。これは、クラスコンシューマーがメソッドを呼び出してオブジェクトをクリーンアップする場合、およびそのタイミングです。Classes that implement Dispose must specify, as part of their class contract, if and when class consumers call the method to clean up the object. 既定では、ガベージコレクターはメソッドを呼び出しません Dispose 。ただし、メソッドの実装では、クラスのメソッドを呼び出して、 Dispose GC ガベージコレクターの終了動作をカスタマイズできます。The garbage collector does not, by default, call the Dispose method; however, implementations of the Dispose method can call methods in the GC class to customize the finalization behavior of the garbage collector.

オブジェクトの終了と dispose パターンの詳細については、「 アンマネージリソースのクリーンアップ」を参照してください。For more information on object finalization and the dispose pattern, see Cleaning Up Unmanaged Resources.

オブジェクトのエージングと生成Object aging and generations

共通言語ランタイムのガベージコレクターは、ジェネレーションを使用したオブジェクトのエージングをサポートしています。The garbage collector in the common language runtime supports object aging using generations. ジェネレーションは、メモリ内のオブジェクトの相対的な経過期間の単位です。A generation is a unit of measure of the relative age of objects in memory. オブジェクトの世代番号 (age) は、オブジェクトが属する世代を示します。The generation number, or age, of an object indicates the generation to which an object belongs. 最近作成されたオブジェクトは、新しい世代の一部であり、アプリケーションのライフサイクルの前に作成されたオブジェクトよりも世代数が低くなります。Objects created more recently are part of newer generations, and have lower generation numbers than objects created earlier in the application life cycle. 最新世代のオブジェクトは、ジェネレーション0にあります。Objects in the most recent generation are in generation 0. このガベージコレクターの実装では、ジェネレーション0、1、および2の3つのジェネレーションのオブジェクトがサポートされています。This implementation of the garbage collector supports three generations of objects, generations 0, 1, and 2. プロパティの値を取得して、 MaxGeneration システムでサポートされている最大のジェネレーション番号を確認できます。You can retrieve the value of the MaxGeneration property to determine the maximum generation number supported by the system.

オブジェクトのエージングにより、アプリケーションは、ガベージコレクターがすべての生成結果を評価するのではなく、特定のジェネレーションのセットでガベージコレクションをターゲットにすることができます。Object aging allows applications to target garbage collection at a specific set of generations rather than requiring the garbage collector to evaluate all generations. Collectパラメーターを含むメソッドのオーバーロードを generation 使用すると、ガベージコレクションの対象となる最も古いジェネレーションを指定できます。Overloads of the Collect method that include a generation parameter allow you to specify the oldest generation to be garbage collected.

ガベージコレクションを禁止Disallowing garbage collection

.NET Framework 4.6 以降では、ガベージコレクターは、ガベージコレクションがアプリのパフォーマンスに悪影響を及ぼす可能性のある重要なパスの実行中に使用できる、GC 領域の無待機モードをサポートしています。Starting with the .NET Framework 4.6, the garbage collector supports a no GC region latency mode that can be used during the execution of critical paths in which garbage collection can adversely affect an app's performance. GC 領域の無待機モードでは、ガベージコレクターからの干渉なしに割り当てることができるメモリ量を指定する必要があります。The no GC region latency mode requires that you specify an amount of memory that can be allocated without interference from the garbage collector. ランタイムは、そのメモリを割り当てることができる場合、クリティカルパスのコードの実行中にガベージコレクションを実行しません。If the runtime can allocate that memory, the runtime will not perform a garbage collection while code in the critical path is executing.

GC 領域のないクリティカルパスの先頭は、のオーバーロードのいずれかを呼び出すことによって定義し TryStartNoGCRegion ます。You define the beginning of the critical path of the no GC region by calling one of the overloads of the TryStartNoGCRegion. クリティカルパスの末尾を指定するには、メソッドを呼び出し EndNoGCRegion ます。You specify the end of its critical path by calling the EndNoGCRegion method.

メソッドへの呼び出しを入れ子にすることはできません TryStartNoGCRegion 。また、 EndNoGCRegion ランタイムが現在 GC 領域の待機時間モードでない場合にのみ、メソッドを呼び出す必要があります。You cannot nest calls to the TryStartNoGCRegion method, and you should only call the EndNoGCRegion method if the runtime is currently in no GC region latency mode. つまり、を複数回呼び出すことはできません TryStartNoGCRegion (最初のメソッド呼び出しの後に、後続の呼び出しが成功しません)。また、への呼び出しが成功したため、への呼び出しが成功することは期待できません EndNoGCRegion TryStartNoGCRegionIn other words, you should not call TryStartNoGCRegion multiple times (after the first method call, subsequent calls will not succeed), and you should not expect calls to EndNoGCRegion to succeed just because the first call to TryStartNoGCRegion succeeded.

プロパティ

MaxGeneration

システムが現在サポートしている最大のジェネレーション番号を取得します。Gets the maximum number of generations that the system currently supports.

メソッド

AddMemoryPressure(Int64)

アンマネージ メモリが大規模に割り当てられたため、ガベージ コレクションをスケジュールするときに考慮する必要があることが、ランタイムに通知されます。Informs the runtime of a large allocation of unmanaged memory that should be taken into account when scheduling garbage collection.

AllocateArray<T>(Int32, Boolean)

配列を割り当てます。Allocates an array.

AllocateUninitializedArray<T>(Int32, Boolean)

可能な場合は、ゼロ初期化のスキップ中に配列を割り当てます。Allocates an array while skipping zero-initialization, if possible.

CancelFullGCNotification()

ガベージ コレクションの通知の登録をキャンセルします。Cancels the registration of a garbage collection notification.

Collect()

すべてのジェネレーションのガベージ コレクションを直ちに強制実行します。Forces an immediate garbage collection of all generations.

Collect(Int32)

ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを直ちに強制実行します。Forces an immediate garbage collection from generation 0 through a specified generation.

Collect(Int32, GCCollectionMode)

GCCollectionMode 値によって指定したタイミングで、ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを強制的に実行します。Forces a garbage collection from generation 0 through a specified generation, at a time specified by a GCCollectionMode value.

Collect(Int32, GCCollectionMode, Boolean)

ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを、 GCCollectionMode 値で指定したタイミングで強制実行します。コレクションをブロックする必要があるかどうかを指定する値を指定します。Forces a garbage collection from generation 0 through a specified generation, at a time specified by a GCCollectionMode value, with a value specifying whether the collection should be blocking.

Collect(Int32, GCCollectionMode, Boolean, Boolean)

ジェネレーション 0 から指定ジェネレーションまでのガベージ コレクションを、 GCCollectionMode 値で指定したタイミングで強制実行します。コレクションをブロックおよび圧縮する必要があるかどうかを指定する値を指定します。Forces a garbage collection from generation 0 through a specified generation, at a time specified by a GCCollectionMode value, with values that specify whether the collection should be blocking and compacting.

CollectionCount(Int32)

指定したジェネレーションのオブジェクトに対するガベージ コレクションの発生回数を返します。Returns the number of times garbage collection has occurred for the specified generation of objects.

EndNoGCRegion()

GC 領域の無待機モードを終了します。Ends the no GC region latency mode.

GetAllocatedBytesForCurrentThread()

その有効期間の開始以降、現在のスレッドに割り当てられた総バイト数を取得します。Gets the total number of bytes allocated to the current thread since the beginning of its lifetime.

GetGCMemoryInfo()

ガベージ コレクションのメモリ情報を取得します。Gets garbage collection memory information.

GetGCMemoryInfo(GCKind)

ガベージ コレクションのメモリ情報を取得します。Gets garbage collection memory information.

GetGeneration(Object)

指定したオブジェクトの現在のジェネレーション番号を返します。Returns the current generation number of the specified object.

GetGeneration(WeakReference)

指定した弱い参照の対象となる現在のジェネレーション番号を返します。Returns the current generation number of the target of a specified weak reference.

GetTotalAllocatedBytes(Boolean)

プロセスの有効期間にわたって割り当てられたバイト数を取得します。Gets a count of the bytes allocated over the lifetime of the process.

GetTotalMemory(Boolean)

現在割り当てられていると思われるバイト数を取得します。Retrieves the number of bytes currently thought to be allocated. パラメーターは、このメソッドが制御を戻す前に短い時間だけ待機して、システムがガベージ コレクションを行い、オブジェクトの終了操作を実行できるようにするかどうかを示します。A parameter indicates whether this method can wait a short interval before returning, to allow the system to collect garbage and finalize objects.

KeepAlive(Object)

指定したオブジェクトを参照することにより、現在のルーチンの開始時からこのメソッドが呼び出される時点までの間、そのオブジェクトをガベージ コレクションの対象から外します。References the specified object, which makes it ineligible for garbage collection from the start of the current routine to the point where this method is called.

RegisterForFullGCNotification(Int32, Int32)

フル ガベージ コレクションの可能性が高い状態のとき、およびガベージ コレクションが完了したときに、ガベージ コレクションの通知を発行する必要があることを指定します。Specifies that a garbage collection notification should be raised when conditions favor full garbage collection and when the collection has been completed.

RemoveMemoryPressure(Int64)

アンマネージ メモリが解放され、ガベージ コレクションのスケジュールにこのメモリを考慮する必要がなくなったことをランタイムに通知します。Informs the runtime that unmanaged memory has been released and no longer needs to be taken into account when scheduling garbage collection.

ReRegisterForFinalize(Object)

SuppressFinalize(Object) が事前に呼び出されている指定オブジェクトに対して、ファイナライザーを呼び出すことをシステムに要求します。Requests that the system call the finalizer for the specified object for which SuppressFinalize(Object) has previously been called.

SuppressFinalize(Object)

指定したオブジェクトに対してファイナライザーを呼び出さないよう共通言語ランタイムに要求します。Requests that the common language runtime not call the finalizer for the specified object.

TryStartNoGCRegion(Int64)

指定した量のメモリを使用可能な場合、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。Attempts to disallow garbage collection during the execution of a critical path if a specified amount of memory is available.

TryStartNoGCRegion(Int64, Boolean)

指定した量のメモリを使用可能な場合は、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。また、最初に十分な量のメモリを使用できない場合に、ガベージ コレクターがフル ブロッキング ガベージ コレクションを実行するかどうかを制御します。Attempts to disallow garbage collection during the execution of a critical path if a specified amount of memory is available, and controls whether the garbage collector does a full blocking garbage collection if not enough memory is initially available.

TryStartNoGCRegion(Int64, Int64)

大きなオブジェクト ヒープおよび小さなオブジェクト ヒープに対して、指定した量のメモリを使用可能な場合、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。Attempts to disallow garbage collection during the execution of a critical path if a specified amount of memory is available for the large object heap and the small object heap.

TryStartNoGCRegion(Int64, Int64, Boolean)

大きなオブジェクト ヒープおよび小さなオブジェクト ヒープに対して、指定した量のメモリを使用可能な場合は、クリティカル パスの実行中にガベージ コレクションが行われないよう、試行します。また、最初に十分な量のメモリを使用できない場合に、ガベージ コレクターがフル ブロッキング ガベージ コレクションを実行するかどうかを制御します。Attempts to disallow garbage collection during the execution of a critical path if a specified amount of memory is available for the large object heap and the small object heap, and controls whether the garbage collector does a full blocking garbage collection if not enough memory is initially available.

WaitForFullGCApproach()

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが近づいているかどうかを確認するための、登録済みの通知の状態を返します。Returns the status of a registered notification for determining whether a full, blocking garbage collection by the common language runtime is imminent.

WaitForFullGCApproach(Int32)

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが近づいているかどうかを確認するための登録済みの通知の状態を、指定したタイムアウト時間で返します。Returns, in a specified time-out period, the status of a registered notification for determining whether a full, blocking garbage collection by the common language runtime is imminent.

WaitForFullGCComplete()

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが完了したかどうかを確認するための、登録済みの通知の状態を返します。Returns the status of a registered notification for determining whether a full, blocking garbage collection by the common language runtime has completed.

WaitForFullGCComplete(Int32)

共通言語ランタイムによるフル ブロッキング ガベージ コレクションが完了したかどうかを確認するための登録済みの通知の状態を、指定したタイムアウト時間で返します。Returns, in a specified time-out period, the status of a registered notification for determining whether a full, blocking garbage collection by common language the runtime has completed.

WaitForPendingFinalizers()

ファイナライザーのキューを処理するスレッドがそのキューを空にするまで、現在のスレッドを中断します。Suspends the current thread until the thread that is processing the queue of finalizers has emptied that queue.

適用対象

こちらもご覧ください