GC クラス
アセンブリ: mscorlib (mscorlib.dll 内)
構文
解説
このクラスのメソッドが影響するのは、オブジェクトに対してガベージ コレクションが実行されるときと、オブジェクトにより割り当てられたリソースを解放するときです。このクラスのプロパティは、システムで利用できるメモリの総量に関する情報、およびオブジェクトに割り当てられているメモリの世代カテゴリ、つまりジェネレーションに関する情報を提供します。
ガベージ コレクタは、マネージ メモリで割り当てられているオブジェクトを追跡し、収集します。ガベージ コレクタは定期的にガベージ コレクションを実行して、有効な参照がないオブジェクトに割り当てられているメモリを収集します。使用可能な空きメモリを使用して、メモリの要求に応えられない場合、ガベージ コレクションが自動的に実行されます。または、アプリケーションは Collect メソッドを使用して、ガベージ コレクションを強制的に実行することもできます。
ガベージ コレクションは、次に示すステップを実行します。
コレクションの実行中、マネージ コード内のオブジェクトへの 1 つ以上の参照が見つかった場合、ガベージ コレクタはそのオブジェクトを解放しません。ただし、ガベージ コレクタは、アンマネージ コードからのオブジェクトへの参照は認識しないため、アンマネージ コードで排他的に使用されているオブジェクトを解放しないように指定されていない限りは、そのようなオブジェクトを解放してしまう場合があります。KeepAlive メソッドには、アンマネージ コードで使用中のオブジェクトをガベージ コレクタが収集するのを防ぐ機構が用意されています。
ガベージ コレクタの実装は、マネージ メモリの割り当てに関する情報を除いて、ファイル ハンドルやデータベース接続などのオブジェクトが所有するリソースに関する情報は保持していません。ある型がアンマネージ リソースを使用し、その型のインスタンスを収集する前にそのリソースを解放する必要がある場合、その型はファイナライザを実装できます。
ほとんどの場合、ファイナライザは Object.Finalize メソッドをオーバーライドすることで実装されますが、C# または C++ で作成された型はデストラクタを実装し、コンパイラがそれらのデストラクタを Object.Finalize のオーバーライドとして処理します。ほとんどの場合、オブジェクトにファイナライザがあれば、ガベージ コレクタはそのオブジェクトを解放する前にファイナライザを呼び出します。ただし、ガベージ コレクタでファイナライザを呼び出さなくてもよい場合もあります。たとえば、SuppressFinalize メソッドでは、ファイナライザの呼び出しを明示的に禁止しています。さらに、ガベージ コレクタは、オブジェクトの終了操作を行うために特定のスレッドを使用することや、相互に参照されているオブジェクトに対してファイナライザが呼び出される順序を保証することはありません。オブジェクトは相互に参照されていない場合には、ガベージ コレクションの対象となります。
特定の時点でリソースを解放する必要がある場合、クラスは、リソース管理やクリーンアップのタスクを実行する IDisposable.Dispose メソッドが含まれた IDisposable インターフェイスを実装できます。Dispose を実装するクラスは、そのクラスのコンシューマがオブジェクトをクリーンアップするためにこのメソッドを呼び出す必要がある場合と、呼び出すタイミングについて、クラスのコントラクトの一部として指定する必要があります。既定では、ガベージ コレクタは Dispose メソッドを呼び出しません。ただし、Dispose メソッドの実装は、GC クラス内のメソッドを呼び出して、ガベージ コレクタの終了操作をカスタマイズできます。
ガベージ コレクタがジェネレーションを使用してオブジェクトの世代化をサポートすることをお勧めしますが、必須ではありません。ジェネレーションとは、メモリ内のオブジェクトの相対世代の単位です。オブジェクトのジェネレーション番号、つまり世代は、オブジェクトが属するジェネレーションを示します。新しく作成されたオブジェクトは、新しいジェネレーションの一部になり、アプリケーション有効期間内で先に作成されたオブジェクトよりも小さいジェネレーション番号が与えられます。最も新しいジェネレーションのオブジェクトは、ジェネレーション 0 に属します。
実装時の注意 ガベージ コレクタの実装は、オブジェクトの 3 つのジェネレーションをサポートします。 MaxGeneration は、システムがサポートする最大ジェネレーション番号を決定するために使用されます。オブジェクトの世代化により、特定のジェネレーションのセットがガベージ コレクションの対象になるため、ガベージ コレクタがすべてのジェネレーションを評価する必要はなくなります。Imports System 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
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(); } } } }
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 ) ); }
package GCCollectIntExample; import System.* ; class MyGCCollectClass { private static final long maxGarbage = 1000; public static void main(String[] args) { MyGCCollectClass myGCCol = new MyGCCollectClass(); // Determine the maximum number of generations the system // garbage collector currently supports. Console.WriteLine("The highest generation is {0}", System.Convert.ToString(GC.get_MaxGeneration())); myGCCol.MakeSomeGarbage(); // Determine which generation myGCCol object is stored in. Console.WriteLine("Generation: {0}", System.Convert.ToString(GC.GetGeneration(myGCCol))); // Determine the best available approximation of the number // of bytes currently allocated in managed memory. Console.WriteLine("Total Memory: {0}", System.Convert.ToString(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}", System.Convert.ToString(GC.GetGeneration(myGCCol))); Console.WriteLine("Total Memory: {0}", System.Convert.ToString(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}", System.Convert.ToString(GC.GetGeneration(myGCCol))); Console.WriteLine("Total Memory: {0}", System.Convert.ToString(GC.GetTotalMemory(false))); Console.Read(); } //main 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(); } } //MakeSomeGarbage } //MyGCCollectClass
System.GC
プラットフォーム
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
GC プロパティ
GC メソッド
パブリック メソッド
GC メンバ
未使用メモリを自動的に収集するサービスであるシステム ガベージ コレクタを制御します。
パブリック プロパティ
パブリック メソッド
Weblioに収録されているすべての辞書からGCを検索する場合は、下記のリンクをクリックしてください。
全ての辞書からGCを検索
- >> 「GC」を含む用語の索引
- GCのページへのリンク