GC Класс

Определение

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

public ref class GC abstract sealed
public ref class GC sealed
public static class GC
public sealed class GC
type GC = class
Public Class GC
Public NotInheritable Class GC
Наследование
GC

Примеры

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

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

Комментарии

Класс GC управляет сборщиком мусора. Сборщик мусора — это компонент среды CLR, который управляет выделением и выпуском управляемой памяти. Методы этого класса влияют на то, что сборка мусора выполняется в объекте и когда ресурсы, выделенные объектом, освобождаются. Свойства этого класса содержат сведения о общем объеме памяти, доступном в системе, а также возрастной категории или поколении памяти, выделенной объекту.

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

Сборка мусора состоит из следующих шагов:

  1. Сборщик мусора ищет управляемые объекты, на которые ссылается управляемый код.
  2. Сборщик мусора пытается финализировать объекты, на которые не ссылаются.
  3. Сборщик мусора освобождает объекты, на которые больше нет ссылок, и восстанавливает их память.

Неуправляемые ресурсы

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

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

В большинстве случаев финализаторы реализуются путем переопределения метода Object.Finalize; однако типы, написанные на C# или C++, реализуют деструкторы, которые компиляторы превращают в переопределение Object.Finalize. В большинстве случаев если объект имеет финализатор, сборщик мусора вызывает его до освобождения объекта. Однако сборщику мусора не требуется вызывать методы завершения во всех ситуациях; например, метод SuppressFinalize может явным образом предотвратить вызов метода завершения объекта. Кроме того, сборщик мусора не обязан использовать определённый поток для завершения объектов и не гарантирует порядок, в котором вызываются методы завершения для объектов, которые ссылаются друг на друга, но при этом доступны для удаления сборщиком мусора.

В сценариях, когда ресурсы должны быть освобождены в определенное время, классы могут реализовать IDisposable интерфейс, содержащий IDisposable.Dispose метод, который выполняет задачи управления ресурсами и очистки. Классы, реализующие Dispose, должны указывать в договоре класса, если и когда потребители классов должны вызывать метод для очистки объекта. Сборщик мусора по умолчанию не вызывает Dispose метод. Однако реализации Dispose метода могут вызывать методы в GC классе для настройки поведения завершения сборщика мусора.

Дополнительные сведения о завершении объектов и шаблоне удаления см. в разделе "Очистка неуправляемых ресурсов".

Старение объектов и поколения

Сборщик мусора в среде CLR поддерживает старение объектов с помощью поколений. Поколение — это единица измерения относительного возраста объектов в памяти. Номер поколения или возраст объекта указывает на поколение, к которому принадлежит объект. Объекты, созданные недавно, являются частью новых поколений и имеют более низкие числа поколений, чем объекты, созданные ранее в жизненном цикле приложения. Объекты в самом новом поколении находятся в поколении 0. Эта реализация сборщика мусора поддерживает три поколения объектов, поколений 0, 1 и 2. Можно получить значение свойства MaxGeneration, чтобы определить максимальное количество поколений, поддерживаемое системой.

Старение объектов позволяет приложениям нацеливать сборку мусора на определенные поколения, а не требовать от сборщика мусора оценку всех поколений. Перегрузки Collect метода, включающего generation параметр, позволяют указать самое старое поколение для сбора мусора.

Запрет сборки мусора

Сборщик мусора поддерживает режим работы без сборки мусора в критических участках, когда сборка мусора может негативно повлиять на производительность приложения. Режим задержки без GC требует указания объема памяти, который можно выделить без вмешательства сборщика мусора. Если среда выполнения может выделить такую память, среда выполнения не выполнит сборку мусора во время выполнения кода в критическом пути.

Вы определяете начало критического пути без региона GC путем вызова одной из перегрузок.TryStartNoGCRegion Вы указываете конец его критического пути путем вызова EndNoGCRegion метода.

Не удается вложить вызовы к методу TryStartNoGCRegion , и метод следует вызывать EndNoGCRegion только в том случае, если среда выполнения в настоящее время не находится в режиме задержки региона GC. Другими словами, не следует вызывать TryStartNoGCRegion несколько раз (после первого вызова метода последующие вызовы не будут успешными), и не следует ожидать, что вызовы на EndNoGCRegion будут успешными только потому что первый вызов на TryStartNoGCRegion был успешным.

Свойства

Имя Описание
MaxGeneration

Получает максимальное число поколений, поддерживаемых системой.

Методы

Имя Описание
AddMemoryPressure(Int64)

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

AllocateArray<T>(Int32, Boolean)

Выделяет массив.

AllocateUninitializedArray<T>(Int32, Boolean)

При возможности выделяет массив, пропуская ноль-инициализацию.

CancelFullGCNotification()

Отменяет регистрацию уведомления о сборке мусора.

Collect()

Заставляет немедленную сборку мусора всех поколений.

Collect(Int32, GCCollectionMode, Boolean, Boolean)

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

Collect(Int32, GCCollectionMode, Boolean)

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

Collect(Int32, GCCollectionMode)

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

Collect(Int32)

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

CollectionCount(Int32)

Возвращает количество попыток сборки мусора для указанного поколения объектов.

EndNoGCRegion()

Заканчивается режим задержки региона GC.

GetAllocatedBytesForCurrentThread()

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

GetConfigurationVariables()

Возвращает конфигурации, используемые сборщиком мусора.

GetGCMemoryInfo()

Возвращает сведения о памяти сборки мусора.

GetGCMemoryInfo(GCKind)

Возвращает сведения о памяти сборки мусора.

GetGeneration(Object)

Возвращает текущее число поколения указанного объекта.

GetGeneration(WeakReference)

Возвращает текущее число поколения целевого объекта указанной слабой ссылки.

GetTotalAllocatedBytes(Boolean)

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

GetTotalMemory(Boolean)

Извлекает размер кучи, за исключением фрагментации. Например, если общий размер кучи GC составляет 100 мб и фрагментация, т. е. пространство, занятое свободными объектами, занимает до 40 мб, этот API будет сообщать 60 мб. Параметр указывает, может ли этот метод ожидать короткого интервала перед возвратом, чтобы разрешить системе собирать объекты мусора и завершить их.

GetTotalPauseDuration()

Возвращает общее время приостановки в GC с начала процесса.

KeepAlive(Object)

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

RefreshMemoryLimit()

Указывает сборщику мусора перенастроить себя, обнаруживая различные ограничения памяти в системе.

RegisterForFullGCNotification(Int32, Int32)

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

RegisterNoGCRegionCallback(Int64, Action)

Регистрирует обратный вызов, вызываемый при выделении определенного объема памяти в регионе без GC.

RemoveMemoryPressure(Int64)

Сообщает среде выполнения, что неуправляемая память была освобождена и больше не должна учитываться при планировании сборки мусора.

ReRegisterForFinalize(Object)

Запрашивает, чтобы система вызывала метод завершения для указанного объекта, для которого SuppressFinalize(Object) был вызван ранее.

SuppressFinalize(Object)

Запрашивает, чтобы среда CLR не вызывала метод завершения для указанного объекта.

TryStartNoGCRegion(Int64, Boolean)

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

TryStartNoGCRegion(Int64, Int64, Boolean)

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

TryStartNoGCRegion(Int64, Int64)

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

TryStartNoGCRegion(Int64)

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

WaitForFullGCApproach()

Возвращает состояние зарегистрированного уведомления о том, является ли полная блокировка сборки мусора средой CLR неминуема.

WaitForFullGCApproach(Int32)

Возвращается в указанный период времени ожидания, состояние зарегистрированного уведомления о том, является ли полная блокировка сборки мусора средой CLR неминуема.

WaitForFullGCApproach(TimeSpan)

Возвращается в указанный период времени ожидания, состояние зарегистрированного уведомления о том, является ли полная блокировка сборки мусора средой CLR неминуема.

WaitForFullGCComplete()

Возвращает состояние зарегистрированного уведомления о том, завершена ли полная блокировка сборки мусора средой CLR.

WaitForFullGCComplete(Int32)

Возвращается в указанный период времени ожидания, состояние зарегистрированного уведомления о том, завершена ли полная блокировка сборки мусора по общему языку среды выполнения.

WaitForFullGCComplete(TimeSpan)

Возвращает состояние зарегистрированного уведомления о завершении блокирующей сборки мусора. Может ждать неограниченное время для полной коллекции.

WaitForPendingFinalizers()

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

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

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