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 ();

Примеры

В следующем примере показано, как использовать 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

Комментарии

Используйте этот метод, чтобы попытаться освободить всю недостающую память. Он выполняет блокирующую сборку мусора всех поколений.

Все объекты, независимо от того, как долго они находились в памяти, учитываются для сбора; однако объекты, на которые ссылается управляемый код, не собираются. Используйте этот метод, чтобы заставить систему попытаться освободить максимальный объем доступной памяти.

Начиная с платформа .NET Framework 4.5.1, можно сжать кучу больших объектов (LOH), присвоив свойству GCSettings.LargeObjectHeapCompactionMode значение GCLargeObjectHeapCompactionMode.CompactOnce перед вызовом Collect метода, как показано в следующем примере.

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Collect(Int32)

Исходный код:
GC.CoreCLR.cs
Исходный код:
GC.CoreCLR.cs
Исходный код:
GC.CoreCLR.cs

Принудительно начинает немедленную сборку мусора, начиная с нулевого поколения и вплоть до указанного поколения.

public static void Collect (int generation);

Параметры

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();
            }
        }
    }
}

Комментарии

Используйте этот метод для освобождения недоступной памяти. Однако использование этого метода не гарантирует, что вся недоступная память в указанном поколении будет освобождена.

Если выполняется старение объектов, сборщик мусора не собирает объекты с номером поколения, превышающим указанное поколение. Если старение объектов не реализовано, сборщик мусора учитывает все объекты во время сборки мусора.

Используйте свойство , MaxGeneration чтобы определить максимально допустимое generation значение параметра.

Чтобы сборщик мусора учитывал все объекты независимо от их создания, используйте версию этого метода, которая не принимает параметров. Чтобы сборщик мусора освобождает объекты на GCCollectionMode основе параметра, используйте перегрузку GC.Collect(Int32, GCCollectionMode) метода .

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Collect(Int32, GCCollectionMode)

Исходный код:
GC.CoreCLR.cs
Исходный код:
GC.CoreCLR.cs
Исходный код:
GC.CoreCLR.cs

Принудительно запускает немедленную сборку мусора начиная с нулевого поколения и вплоть до указанного поколения в момент времени, заданный значением GCCollectionMode.

public static void Collect (int generation, GCCollectionMode mode);

Параметры

generation
Int32

Количество старших поколений, для которых следует выполнить сборку мусора.

mode
GCCollectionMode

Значение перечисления, указывающее, является ли сборка мусора принудительной (Default или Forced) или оптимизированной (Optimized).

Исключения

Недопустимый параметр generation.

-или-

mode не является одним из значений GCCollectionMode .

Примеры

В следующем примере выполняется принудительное выполнение сборки мусора для объектов поколения 2 с Optimized помощью параметра .

using System;

class Program
{
    static void Main(string[] args)
    {
        GC.Collect(2, GCCollectionMode.Optimized);
    }
}

Комментарии

Используйте параметр , mode чтобы указать, должна ли сборка мусора происходить немедленно или только при оптимальном времени для освобождения объектов. Использование этого метода не гарантирует, что вся недоступная память в указанном поколении будет освобождена.

Чтобы настроить навязчивость сборки мусора в критические периоды в приложении, задайте LatencyMode свойство .

Сборщик мусора не собирает объекты с номером поколения, превышающим указанное параметром generation . Используйте свойство , MaxGeneration чтобы определить максимально допустимое generationзначение .

Чтобы сборщик мусора учитывал все объекты независимо от их создания, используйте версию этого метода, которая не принимает параметров.

Чтобы сборщик мусора отнимает объекты до указанного поколения объектов, используйте перегрузку GC.Collect(Int32) метода . При указании максимального поколения собираются все объекты.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

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);

Параметры

generation
Int32

Количество старших поколений, для которых следует выполнить сборку мусора.

mode
GCCollectionMode

Значение перечисления, указывающее, является ли сборка мусора принудительной (Default или Forced) или оптимизированной (Optimized).

blocking
Boolean

Значение true для выполнения сборки мусора с блокировкой; значение false для выполнения фоновой сборки мусора, где это возможно.

Исключения

Недопустимый параметр generation.

-или-

mode не является одним из значений GCCollectionMode .

Комментарии

В следующей таблице приведены сведения о взаимодействии 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 метода .

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

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);

Параметры

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);

Указание true для аргумента compacting гарантирует сжатие и полную блокировку сборки мусора. GCSettings.LargeObjectHeapCompactionMode Если задать для свойства значение , GCLargeObjectHeapCompactionMode.CompactOnce вы убедитесь, что как LOH, так и SOH будут сжаты.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1