GC.Collect Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Принудительно выполняет сборку мусора.
Перегрузки
| Имя | Описание |
|---|---|
| Collect() |
Заставляет немедленную сборку мусора всех поколений. |
| Collect(Int32) |
Принудительно выполняет немедленную сборку мусора от поколения 0 до указанного поколения. |
| Collect(Int32, GCCollectionMode) |
Принудительно выполняет сборку мусора от поколения 0 до указанного поколения, за раз, указанного значением GCCollectionMode . |
| Collect(Int32, GCCollectionMode, Boolean) |
Принудительно создает сборку мусора от поколения 0 до указанного поколения, задается значением GCCollectionMode , указывающим, должна ли коллекция блокироваться. |
| Collect(Int32, GCCollectionMode, Boolean, Boolean) |
Принудительно создает сборку мусора от поколения 0 до указанного поколения, задается GCCollectionMode значением со значениями, указывающими, должна ли коллекция блокироваться и сжиматься. |
Collect()
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- 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 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
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
Принудительно выполняет немедленную сборку мусора от поколения 0 до указанного поколения.
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 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
- Исходный код:
- GC.CoreCLR.cs
- Исходный код:
- GC.CoreCLR.cs
Принудительно выполняет сборку мусора от поколения 0 до указанного поколения, за раз, указанного значением 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
- Исходный код:
- 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 для выполнения фоновой сборки мусора по возможности.
Исключения
Комментарии
В следующей таблице приведены сведения о взаимодействии с параметрами и blocking параметрамиmode.
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
- Исходный код:
- 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 только для очистки.
Комментарии
В противном falseслучае blocking GC решает, следует ли выполнять фон или блокировку сборки мусора. Если 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.