GC クラス
未使用メモリを自動的に収集するサービスであるシステム ガベージ コレクタを制御します。
この型のすべてのメンバの一覧については、GC メンバ を参照してください。
System.Object
System.GC
NotInheritable Public Class GC
[C#]
public sealed class GC
[C++]
public __gc __sealed class GC
[JScript]
public class GC
スレッドセーフ
この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。
解説
このクラスのメソッドが影響するのは、オブジェクトがガベージ コレクションで収集されるときと、オブジェクトにより割り当てられたリソースを解放するときです。このクラスのプロパティは、システムで利用できるメモリの総量に関する情報、およびオブジェクトに割り当てられているメモリの世代カテゴリ、つまりジェネレーションに関する情報を提供します。
ガベージ コレクタは、マネージ メモリで割り当てられているオブジェクトを追跡し、収集します。ガベージ コレクタは定期的にガベージ コレクションを実行して、有効な参照がないオブジェクトに割り当てられているメモリを収集します。使用可能な空きメモリを使用して、メモリの要求に応えられない場合、ガベージ コレクションが自動的に実行されます。または、アプリケーションは Collect メソッドを使用して、ガベージ コレクションを強制的に実行することもできます。
ガベージ コレクションは、次に示すステップを実行します。
- ガベージ コレクタは、マネージ コードで参照されるマネージ オブジェクトを検索します。
- ガベージ コレクタは、参照されないオブジェクトの終了を試みます。
- ガベージ コレクタは、参照されないオブジェクトを解放し、それらのオブジェクトのメモリを収集します。
コレクションの実行中、マネージ コード内のオブジェクトへの 1 つ以上の参照が見つかった場合、ガベージ コレクタはそのオブジェクトを解放しません。ただし、ガベージ コレクタは、アンマネージ コードからのオブジェクトへの参照は認識しないため、アンマネージ コードで排他的に使用されているオブジェクトを解放しないように指定されていない限りは、そのようなオブジェクトを解放してしまう場合があります。 KeepAlive メソッドには、アンマネージ コードで使用中のオブジェクトをガベージ コレクタが収集するのを防ぐ機構が用意されています。
ガベージ コレクタの実装は、マネージ メモリの割り当てに関する情報を除いて、ファイル ハンドルやデータベース接続などのオブジェクトが所有するリソースに関する情報は保持していません。ある型がアンマネージ リソースを使用し、その型のインスタンスを収集する前にそのリソースを解放する必要がある場合、その型はファイナライザを実装できます。
ほとんどの場合、ファイナライザは Object.Finalize メソッドをオーバーライドすることで実装されますが、C# または C++ で作成された型はデストラクタを実装し、コンパイラがそれらのデストラクタを Object.Finalize のオーバーライドとして処理します。ほとんどの場合、オブジェクトにファイナライザがあれば、ガベージ コレクタはそのオブジェクトを解放する前にファイナライザを呼び出します。ただし、ガベージ コレクタは、すべての状況でファイナライザを呼び出す必要はありません。さらに、ガベージ コレクタは、オブジェクトの終了操作を行うために特定のスレッドを使用することや、相互に参照されているオブジェクトに対してファイナライザが呼び出される順序を保証することはありません。オブジェクトは相互に参照されていない場合には、ガベージ コレクションの対象となります。
特定の時点でリソースを解放する必要がある場合、クラスは、リソース管理やクリーンアップのタスクを実行する 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 generation 2 only.
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
[C#]
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 generation 2 only.
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();
}
}
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
const long maxGarbage = 1000;
__gc 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 = new Version();
}
}
};
int main() {
MyGCCollectClass* myGCCol = new MyGCCollectClass();
// Determine the maximum number of generations the system
// garbage collector currently supports.
Console::WriteLine(S"The highest generation is {0}", __box(GC::MaxGeneration));
myGCCol->MakeSomeGarbage();
// Determine which generation myGCCol object is stored in.
Console::WriteLine(S"Generation: {0}", __box(GC::GetGeneration(myGCCol)));
// Determine the best available approximation of the number
// of bytes currently allocated in managed memory.
Console::WriteLine(S"Total Memory: {0}", __box(GC::GetTotalMemory(false)));
// Perform a collection of generation 0 only.
GC::Collect(0);
// Determine which generation myGCCol object is stored in.
Console::WriteLine(S"Generation: {0}", __box(GC::GetGeneration(myGCCol)));
Console::WriteLine(S"Total Memory: {0}", __box(GC::GetTotalMemory(false)));
// Perform a collection of generation 2 only.
GC::Collect(2);
// Determine which generation myGCCol object is stored in.
Console::WriteLine(S"Generation: {0}", __box(GC::GetGeneration(myGCCol)));
Console::WriteLine(S"Total Memory: {0}", __box(GC::GetTotalMemory(false)));
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
アセンブリ: Mscorlib (Mscorlib.dll 内)