GC.Collect Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Принудительно начинает сборку мусора.
Перегрузки
Collect() |
Принудительно запускает немедленную сборку мусора для всех поколений. |
Collect(Int32) |
Принудительно начинает немедленную сборку мусора, начиная с нулевого поколения и вплоть до указанного поколения. |
Collect(Int32, GCCollectionMode) |
Принудительно запускает немедленную сборку мусора начиная с нулевого поколения и вплоть до указанного поколения в момент времени, заданный значением GCCollectionMode. |
Collect(Int32, GCCollectionMode, Boolean) |
Принудительная сборка мусора с поколения 0 до указанного поколения во время, указанное значением GCCollectionMode, со значением, указывающим, должна ли сборка быть блокирующей. |
Collect(Int32, GCCollectionMode, Boolean, Boolean) |
Принудительная сборка мусора с поколения 0 до указанного поколения во время, указанное значением GCCollectionMode, со значениями, указывающими, должна ли сборка быть блокирующей и сжимающей. |
Collect()
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
Принудительно запускает немедленную сборку мусора для всех поколений.
public:
static void Collect();
public static void Collect ();
static member Collect : unit -> unit
Public Shared Sub Collect ()
Примеры
В следующем примере показано, как использовать Collect метод для выполнения сбора данных во всех поколениях памяти. Код создает ряд неиспользуемых объектов, а затем вызывает Collect метод для их очистки из памяти.
using namespace System;
const int maxGarbage = 1000;
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;
}
}
void main()
{
// Put some objects in memory.
MakeSomeGarbage();
Console::WriteLine("Memory used before collection: {0:N0}",
GC::GetTotalMemory( false ) );
// Collect all generations of memory.
GC::Collect();
Console::WriteLine("Memory used after full collection: {0:N0}",
GC::GetTotalMemory( true ) );
}
// The output from the example resembles the following:
// Memory used before collection: 79,392
// Memory used after full collection: 52,640
using System;
class MyGCCollectClass
{
private const int maxGarbage = 1000;
static void Main()
{
// Put some objects in memory.
MyGCCollectClass.MakeSomeGarbage();
Console.WriteLine("Memory used before collection: {0:N0}",
GC.GetTotalMemory(false));
// Collect all generations of memory.
GC.Collect();
Console.WriteLine("Memory used after full collection: {0:N0}",
GC.GetTotalMemory(true));
}
static void MakeSomeGarbage()
{
Version vt;
// Create objects and release them to fill up memory with unused objects.
for(int i = 0; i < maxGarbage; i++) {
vt = new Version();
}
}
}
// The output from the example resembles the following:
// Memory used before collection: 79,392
// Memory used after full collection: 52,640
open System
let maxGarbage = 1000
let makeSomeGarbage () =
// Create objects and release them to fill up memory with unused objects.
for _ = 1 to maxGarbage do
Version() |> ignore
// Put some objects in memory.
makeSomeGarbage()
printfn $"Memory used before collection: {GC.GetTotalMemory false:N0}"
// Collect all generations of memory.
GC.Collect()
printfn $"Memory used after full collection: {GC.GetTotalMemory true:N0}"
// The output from the example resembles the following:
// Memory used before collection: 79,392
// Memory used after full collection: 52,640
Class MyGCCollectClass
Private Const maxGarbage As Integer = 1000
Shared Sub Main()
'Put some objects in memory.
MyGCCollectClass.MakeSomeGarbage()
Console.WriteLine("Memory used before collection: {0:N0}",
GC.GetTotalMemory(False))
'Collect all generations of memory.
GC.Collect()
Console.WriteLine("Memory used after full collection: {0:N0}",
GC.GetTotalMemory(True))
End Sub
Shared 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
End Sub
End Class
' The output from the example resembles the following:
' Memory used before collection: 79,392
' Memory used after full collection: 52,640
Комментарии
Используйте этот метод, чтобы попытаться освободить всю недостающую память. Он выполняет блокирующую сборку мусора всех поколений.
Все объекты, независимо от того, как долго они находились в памяти, учитываются для сбора; однако объекты, на которые ссылается управляемый код, не собираются. Используйте этот метод, чтобы заставить систему попытаться освободить максимальный объем доступной памяти.
Начиная с платформа .NET Framework 4.5.1, можно сжать кучу больших объектов (LOH), присвоив свойству GCSettings.LargeObjectHeapCompactionMode значение GCLargeObjectHeapCompactionMode.CompactOnce перед вызовом Collect метода, как показано в следующем примере.
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
GCSettings.LargeObjectHeapCompactionMode <- GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect()
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect()
См. также раздел
Применяется к
Collect(Int32)
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
Принудительно начинает немедленную сборку мусора, начиная с нулевого поколения и вплоть до указанного поколения.
public:
static void Collect(int generation);
public static void Collect (int generation);
static member Collect : int -> unit
Public Shared Sub Collect (generation As Integer)
Параметры
- generation
- Int32
Количество старших поколений, для которых следует выполнить сборку мусора.
Исключения
Недопустимый параметр generation
.
Примеры
В следующем примере показано, как использовать Collect метод для выполнения сбора на отдельных уровнях памяти. Код создает ряд неиспользуемых объектов, а затем вызывает Collect метод для их очистки из памяти.
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();
}
}
}
}
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
Комментарии
Используйте этот метод для освобождения недоступной памяти. Однако использование этого метода не гарантирует, что вся недоступная память в указанном поколении будет освобождена.
Если выполняется старение объектов, сборщик мусора не собирает объекты с номером поколения, превышающим указанное поколение. Если старение объектов не реализовано, сборщик мусора учитывает все объекты во время сборки мусора.
Используйте свойство , MaxGeneration чтобы определить максимально допустимое generation
значение параметра.
Чтобы сборщик мусора учитывал все объекты независимо от их создания, используйте версию этого метода, которая не принимает параметров. Чтобы сборщик мусора освобождает объекты на GCCollectionMode основе параметра, используйте перегрузку GC.Collect(Int32, GCCollectionMode) метода .
См. также раздел
Применяется к
Collect(Int32, GCCollectionMode)
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
Принудительно запускает немедленную сборку мусора начиная с нулевого поколения и вплоть до указанного поколения в момент времени, заданный значением GCCollectionMode.
public:
static void Collect(int generation, GCCollectionMode mode);
public static void Collect (int generation, GCCollectionMode mode);
static member Collect : int * GCCollectionMode -> unit
Public Shared Sub Collect (generation As Integer, mode As GCCollectionMode)
Параметры
- generation
- Int32
Количество старших поколений, для которых следует выполнить сборку мусора.
- mode
- GCCollectionMode
Значение перечисления, указывающее, является ли сборка мусора принудительной (Default или Forced) или оптимизированной (Optimized).
Исключения
Примеры
В следующем примере выполняется принудительное выполнение сборки мусора для объектов поколения 2 с Optimized помощью параметра .
using System;
class Program
{
static void Main(string[] args)
{
GC.Collect(2, GCCollectionMode.Optimized);
}
}
open System
GC.Collect(2, GCCollectionMode.Optimized)
Class Program
Public Shared Sub Main()
GC.Collect(2, GCCollectionMode.Optimized)
End Sub
End Class
Комментарии
Используйте параметр , mode
чтобы указать, должна ли сборка мусора происходить немедленно или только при оптимальном времени для освобождения объектов. Использование этого метода не гарантирует, что вся недоступная память в указанном поколении будет освобождена.
Чтобы настроить навязчивость сборки мусора в критические периоды в приложении, задайте LatencyMode свойство .
Сборщик мусора не собирает объекты с номером поколения, превышающим указанное параметром generation
. Используйте свойство , MaxGeneration чтобы определить максимально допустимое generation
значение .
Чтобы сборщик мусора учитывал все объекты независимо от их создания, используйте версию этого метода, которая не принимает параметров.
Чтобы сборщик мусора отнимает объекты до указанного поколения объектов, используйте перегрузку GC.Collect(Int32) метода . При указании максимального поколения собираются все объекты.
См. также раздел
Применяется к
Collect(Int32, GCCollectionMode, Boolean)
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
Принудительная сборка мусора с поколения 0 до указанного поколения во время, указанное значением GCCollectionMode, со значением, указывающим, должна ли сборка быть блокирующей.
public:
static void Collect(int generation, GCCollectionMode mode, bool blocking);
public static void Collect (int generation, GCCollectionMode mode, bool blocking);
static member Collect : int * GCCollectionMode * bool -> unit
Public Shared Sub Collect (generation As Integer, mode As GCCollectionMode, blocking As Boolean)
Параметры
- generation
- Int32
Количество старших поколений, для которых следует выполнить сборку мусора.
- mode
- GCCollectionMode
Значение перечисления, указывающее, является ли сборка мусора принудительной (Default или Forced) или оптимизированной (Optimized).
- blocking
- Boolean
Значение true
для выполнения сборки мусора с блокировкой; значение false
для выполнения фоновой сборки мусора, где это возможно.
Исключения
Комментарии
В следующей таблице приведены сведения о взаимодействии mode
параметров и blocking
.
mode |
blocking равно true |
blocking равно false |
---|---|---|
Forced или Default | Блокирующий сбор выполнится, как только это станет возможным. Если фоновая коллекция выполняется и generation имеет значение 0 или 1, Collect(Int32, GCCollectionMode, Boolean) метод немедленно активирует блокирующую коллекцию и возвращает ее по завершении. Если фоновая коллекция выполняется и generation имеет значение 2, метод ожидает завершения фоновой коллекции, активирует блокирующую коллекцию поколения 2, а затем возвращает . |
Сборка выполнится, как только это станет возможным. Метод Collect(Int32, GCCollectionMode, Boolean) запрашивает фоновую сборку, но не гарантирует этот режим. В зависимости от обстоятельств может выполняться блокирующая сборка. Если фоновая сборка уже выполняется, метод возвращает управление немедленно. |
Optimized | Заблокированная коллекция может быть выполнена в зависимости от состояния сборщика мусора и параметра generation . Сборщик мусора пытается обеспечить оптимальную производительность. |
Коллекция может быть выполнена в зависимости от состояния сборщика мусора. Метод Collect(Int32, GCCollectionMode, Boolean) запрашивает фоновую коллекцию, однако это не гарантированно. В зависимости от обстоятельств блокирующая коллекция может выполняться. Сборщик мусора пытается обеспечить оптимальную производительность. Если фоновая сборка уже выполняется, метод возвращает управление немедленно. |
Если вызов метода выполняет полную блокирующую сборку Collect(Int32, GCCollectionMode, Boolean) мусора, можно также сжать кучу больших объектов, присвоив свойству GCSettings.LargeObjectHeapCompactionMode значение GCLargeObjectHeapCompactionMode.CompactOnce перед вызовом Collect метода .
Применяется к
Collect(Int32, GCCollectionMode, Boolean, Boolean)
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
Принудительная сборка мусора с поколения 0 до указанного поколения во время, указанное значением GCCollectionMode, со значениями, указывающими, должна ли сборка быть блокирующей и сжимающей.
public:
static void Collect(int generation, GCCollectionMode mode, bool blocking, bool compacting);
public static void Collect (int generation, GCCollectionMode mode, bool blocking, bool compacting);
static member Collect : int * GCCollectionMode * bool * bool -> unit
Public Shared Sub Collect (generation As Integer, mode As GCCollectionMode, blocking As Boolean, compacting As Boolean)
Параметры
- generation
- Int32
Количество старших поколений, для которых следует выполнить сборку мусора.
- mode
- GCCollectionMode
Значение перечисления, указывающее, является ли сборка мусора принудительной (Default или Forced) или оптимизированной (Optimized).
- blocking
- Boolean
Значение true
для выполнения сборки мусора с блокировкой; значение false
для выполнения фоновой сборки мусора, где это возможно.
- compacting
- Boolean
Значение true
, чтобы сжимать кучу маленьких объектов; значение false
, чтобы только очищать.
Комментарии
Если blocking
имеет значение false
, сборка мусора решает, следует ли выполнять фоновую или блокирующую сборку мусора. Если compacting
имеет значение true
, он выполняет блокирующую сборку мусора.
Если compacting
имеет значение true
, среда выполнения сжимает кучу небольших объектов (SOH). Куча больших объектов (LOH) не сжимается, если свойству GCSettings.LargeObjectHeapCompactionMode не присвоено значение GCLargeObjectHeapCompactionMode.CompactOnce. Обратите внимание, что сюда входят все блокирующие сборки мусора, а не только полная блокировка сборок мусора.
Можно вызвать метод , Collect(Int32, GCCollectionMode, Boolean, Boolean) чтобы уменьшить управляемую кучу до наименьшего возможного размера, как показано в следующем фрагменте кода.
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect(2, GCCollectionMode.Forced, true, true);
GCSettings.LargeObjectHeapCompactionMode <- GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect(2, GCCollectionMode.Forced, true, true)
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect(2, GCCollectionMode.Forced, True, True)
Указание true
для аргумента compacting
гарантирует сжатие и полную блокировку сборки мусора.
GCSettings.LargeObjectHeapCompactionMode Если задать для свойства значение , GCLargeObjectHeapCompactionMode.CompactOnce вы убедитесь, что как LOH, так и SOH будут сжаты.