Основы сборки мусораFundamentals of garbage collection

В среде CLR сборщик мусора выполняет функции автоматического диспетчера памяти.In the common language runtime (CLR), the garbage collector (GC) serves as an automatic memory manager. Сборщик мусора управляет выделением и освобождением памяти для приложения.The garbage collector manages the allocation and release of memory for an application. Следовательно, разработчикам, работающим с управляемым кодом, не нужно писать код для выполнения задач по управлению памятью.For developers working with managed code, this means that you don't have to write code to perform memory management tasks. Автоматическое управление памятью позволяет устранить распространенные проблемы, которые связаны с утечкой памяти из-за того, что объект не был освобожден, или попыткой доступа к памяти для объекта, который был освобожден.Automatic memory management can eliminate common problems, such as forgetting to free an object and causing a memory leak or attempting to access memory for an object that's already been freed.

В этой статье описаны основные понятия сборки мусора.This article describes the core concepts of garbage collection.

ПреимуществаBenefits

Использование сборщика мусора обеспечивает следующие преимущества:The garbage collector provides the following benefits:

  • Разработчикам не нужно освобождать память вручную.Frees developers from having to manually release memory.

  • Эффективно выделяет память для объектов в управляемой куче.Allocates objects on the managed heap efficiently.

  • Уничтожает объекты, которые больше не используются, очищает их память и сохраняет память доступной для будущих распределений.Reclaims objects that are no longer being used, clears their memory, and keeps the memory available for future allocations. Управляемые объекты автоматически получают чистое содержимое, поэтому конструкторам не нужно инициализировать каждое поле данных.Managed objects automatically get clean content to start with, so their constructors don't have to initialize every data field.

  • Обеспечивает безопасность памяти, гарантируя, что объект не сможет использовать содержимое другого объекта.Provides memory safety by making sure that an object cannot use the content of another object.

Основы работы с памятьюFundamentals of memory

В следующем списке перечислены важные понятия памяти среды CLR.The following list summarizes important CLR memory concepts.

  • Каждый процесс имеет свое собственное отдельное виртуальное адресное пространство.Each process has its own, separate virtual address space. Все процессы на одном компьютере совместно используют одну и ту же физическую память и один файл подкачки, если он есть.All processes on the same computer share the same physical memory and the page file, if there is one.

  • По умолчанию на 32-разрядных компьютерах каждому процессу выделяется 2 Гбайт виртуального адресного пространства в пользовательском режиме.By default, on 32-bit computers, each process has a 2-GB user-mode virtual address space.

  • Разработчики приложений работают только с виртуальным адресным пространством и никогда не управляют физической памятью напрямую.As an application developer, you work only with virtual address space and never manipulate physical memory directly. Сборщик мусора выделяет и освобождает виртуальную память для разработчика в управляемой куче.The garbage collector allocates and frees virtual memory for you on the managed heap.

    При написании машинного кода для работы с виртуальным адресным пространством используются функции Windows.If you're writing native code, you use Windows functions to work with the virtual address space. Эти функции выделяют и освобождают виртуальную память для разработчика в собственных кучах.These functions allocate and free virtual memory for you on native heaps.

  • Виртуальная память может находиться в трех состояниях.Virtual memory can be in three states:

    ОбластьState ОписаниеDescription
    FreeFree Ссылки на блок памяти отсутствуют, и он доступен для выделения.The block of memory has no references to it and is available for allocation.
    ЗарезервированноеReserved Блок памяти доступен для использования разработчиком и не может использоваться для какого-либо другого запроса на выделение.The block of memory is available for your use and cannot be used for any other allocation request. Однако сохранение данных в этот блок памяти невозможно, пока он не будет выделен.However, you cannot store data to this memory block until it is committed.
    ФиксацияCommitted Блок памяти назначен физическому хранилищу.The block of memory is assigned to physical storage.
  • Виртуальное адресное пространство может стать фрагментированным.Virtual address space can get fragmented. Это означает, что в адресном пространстве находятся свободные блоки, также известные как пропуски.This means that there are free blocks, also known as holes, in the address space. Когда производится запрос на выделение виртуальной памяти, диспетчер виртуальной памяти должен найти один свободный блок достаточного размера для выполнения этого запроса на выделение.When a virtual memory allocation is requested, the virtual memory manager has to find a single free block that is large enough to satisfy that allocation request. Даже если в системе есть 2 ГБ свободного пространства, операция выделения 2 ГБ завершится неудачей, если это пространство не расположено в одном адресном блоке.Even if you have 2 GB of free space, an allocation that requires 2 GB will be unsuccessful unless all of that free space is in a single address block.

  • Память может закончиться, если будет недостаточно виртуального адресного пространства для резервирования или физического пространства для выделения.You can run out of memory if there isn't enough virtual address space to reserve or physical space to commit.

    Файл подкачки используется, даже если нехватка физической памяти (то есть потребность в физической памяти) невелика.The page file is used even if physical memory pressure (that is, demand for physical memory) is low. При первом возникновении нехватки физической памяти операционная система должна освободить пространство в физической памяти для хранения данных, для чего она производит резервное копирование некоторых данных, находящихся в физической памяти, в файл подкачки.The first time that physical memory pressure is high, the operating system must make room in physical memory to store data, and it backs up some of the data that is in physical memory to the page file. Эти данные не выгружаются, пока в этом нет необходимости, так что с подкачкой можно столкнуться в ситуациях с небольшой нехваткой физической памяти.That data is not paged until it's needed, so it's possible to encounter paging in situations where the physical memory pressure is low.

Выделение памятиMemory allocation

При инициализации нового процесса среда выполнения резервирует для него непрерывную область адресного пространства.When you initialize a new process, the runtime reserves a contiguous region of address space for the process. Это зарезервированное адресное пространство называется управляемой кучей.This reserved address space is called the managed heap. Эта управляемая куча содержит указатель адреса, с которого будет выделена память для следующего объекта в куче.The managed heap maintains a pointer to the address where the next object in the heap will be allocated. Изначально этот указатель устанавливается в базовый адрес управляемой кучи.Initially, this pointer is set to the managed heap's base address. Все ссылочные типы размещаются в управляемой куче.All reference types are allocated on the managed heap. Когда приложение создает первый ссылочный тип, память для него выделяется, начиная с базового адреса управляемой кучи.When an application creates the first reference type, memory is allocated for the type at the base address of the managed heap. При создании приложением следующего объекта сборщик мусора выделяет для него память в адресном пространстве, непосредственно следующем за первым объектом.When the application creates the next object, the garbage collector allocates memory for it in the address space immediately following the first object. Пока имеется доступное адресное пространство, сборщик мусора продолжает выделять пространство для новых объектов по этой схеме.As long as address space is available, the garbage collector continues to allocate space for new objects in this manner.

Выделение памяти из управляемой кучи происходит быстрее, чем неуправляемое выделение памяти.Allocating memory from the managed heap is faster than unmanaged memory allocation. Так как среда выполнения выделяет память для объекта путем добавления значения к указателю, это осуществляется почти так же быстро, как выделение памяти из стека.Because the runtime allocates memory for an object by adding a value to a pointer, it's almost as fast as allocating memory from the stack. Кроме того, поскольку выделяемые последовательно новые объекты располагаются в управляемой куче непрерывно, приложение может быстро получать доступ к ним.In addition, because new objects that are allocated consecutively are stored contiguously in the managed heap, an application can access the objects quickly.

Освобождение памятиMemory release

Механизм оптимизации сборщика мусора определяет наилучшее время для выполнения сбора, основываясь на произведенных выделениях памяти.The garbage collector's optimizing engine determines the best time to perform a collection based on the allocations being made. Когда сборщик мусора выполняет очистку, он освобождает память, выделенную для объектов, которые больше не используются приложением.When the garbage collector performs a collection, it releases the memory for objects that are no longer being used by the application. Он определяет, какие объекты больше не используются, анализируя корни приложения.It determines which objects are no longer being used by examining the application's roots. Корни приложения содержат статические поля, локальные переменные и параметры стека потока, а также регистры процессора.An application's roots include static fields, local variables and parameters on a thread's stack, and CPU registers. Каждый корень либо ссылается на объект, находящийся в управляемой куче, либо имеет значение NULL.Each root either refers to an object on the managed heap or is set to null. Сборщик мусора имеет доступ к списку активных корней, которые поддерживаются JIT-компилятором и средой выполнения.The garbage collector has access to the list of active roots that the just-in-time (JIT) compiler and the runtime maintain. С помощью этого списка он проверяет корни приложения и при этом создает граф, содержащий все объекты, к которым можно получить доступ из этих корней.Using this list, the garbage collector creates a graph that contains all the objects that are reachable from the roots.

Объекты, не входящие в этот граф, являются недостижимыми из данных корней приложения.Objects that are not in the graph are unreachable from the application's roots. Сборщик мусора считает недостижимые объекты мусором и освобождает выделенную для них память.The garbage collector considers unreachable objects garbage and releases the memory allocated for them. В процессе очистки сборщик мусора проверяет управляемую кучу, отыскивая блоки адресного пространства, занятые недостижимыми объектами.During a collection, the garbage collector examines the managed heap, looking for the blocks of address space occupied by unreachable objects. При обнаружении недостижимого объекта он использует функцию копирования памяти для уплотнения достижимых объектов в памяти, освобождая блоки адресного пространства, выделенные под недостижимые объекты.As it discovers each unreachable object, it uses a memory-copying function to compact the reachable objects in memory, freeing up the blocks of address spaces allocated to unreachable objects. После уплотнения памяти, занимаемой достижимыми объектами, сборщик мусора вносит необходимые поправки в указатель, чтобы корни приложения указывали на новые расположения объектов.Once the memory for the reachable objects has been compacted, the garbage collector makes the necessary pointer corrections so that the application's roots point to the objects in their new locations. Он также устанавливает указатель управляемой кучи в положение после последнего достижимого объекта.It also positions the managed heap's pointer after the last reachable object.

Память уплотняется, только если при очистке обнаруживается значительное число недостижимых объектов.Memory is compacted only if a collection discovers a significant number of unreachable objects. Если после сборки мусора все объекты в управляемой куче остаются на месте, то уплотнение памяти не требуется.If all the objects in the managed heap survive a collection, then there is no need for memory compaction.

Для повышения производительности среда выполнения выделяет память для больших объектов в отдельной куче.To improve performance, the runtime allocates memory for large objects in a separate heap. Сборщик мусора автоматически освобождает память, выделенную для больших объектов.The garbage collector automatically releases the memory for large objects. Но для устранения перемещений в памяти больших объектов эта память обычно не сжимается.However, to avoid moving large objects in memory, this memory is usually not compacted.

Условия для сборки мусораConditions for a garbage collection

Сборка мусора возникает при выполнении одного из следующих условий:Garbage collection occurs when one of the following conditions is true:

  • Недостаточно физической памяти в системе.The system has low physical memory. Это можно определить по уведомлению операционной системы о нехватке памяти или по сообщению узла о нехватке памяти.This is detected by either the low memory notification from the OS or low memory as indicated by the host.

  • Объем памяти, используемой объектами, выделенными в управляемой куче, превышает допустимый порог.The memory that's used by allocated objects on the managed heap surpasses an acceptable threshold. Этот порог непрерывно корректируется во время выполнения процесса.This threshold is continuously adjusted as the process runs.

  • вызывается метод GC.Collect .The GC.Collect method is called. Практически во всех случаях вызов этого метода не потребуется, так как сборщик мусора работает непрерывно.In almost all cases, you don't have to call this method, because the garbage collector runs continuously. Этот метод в основном используется для уникальных ситуаций и тестирования.This method is primarily used for unique situations and testing.

Управляемая кучаThe managed heap

После инициализации средой CLR сборщик мусора выделяет сегмент памяти для хранения объектов и управления ими.After the garbage collector is initialized by the CLR, it allocates a segment of memory to store and manage objects. Эта память называется управляемой кучей в отличие от собственной кучи операционной системы.This memory is called the managed heap, as opposed to a native heap in the operating system.

Управляемая куча создается для каждого управляемого процесса.There is a managed heap for each managed process. Все потоки в процессе выделяют память для объектов в одной и той же куче.All threads in the process allocate memory for objects on the same heap.

Для резервирования памяти сборщик мусора вызывает функцию Windows VirtualAlloc и резервирует для управляемых приложений по одному сегменту памяти за раз.To reserve memory, the garbage collector calls the Windows VirtualAlloc function and reserves one segment of memory at a time for managed applications. Сборщик мусора также резервирует сегменты по мере необходимости и возвращает операционной системе освобожденные сегменты (очистив их от всех объектов), вызывая функцию Windows VirtualFree.The garbage collector also reserves segments, as needed, and releases segments back to the operating system (after clearing them of any objects) by calling the Windows VirtualFree function.

Важно!

Размер сегментов, выделенных сборщиком мусора, зависит от реализации и может быть изменен в любое время, в том числе при периодических обновлениях.The size of segments allocated by the garbage collector is implementation-specific and is subject to change at any time, including in periodic updates. Приложение не должно делать никаких допущений относительно размера определенного сегмента, полагаться на него или пытаться настроить объем памяти, доступный для выделения сегментов.Your app should never make assumptions about or depend on a particular segment size, nor should it attempt to configure the amount of memory available for segment allocations.

Чем меньше объектов распределено в куче, тем меньше придется работать сборщику мусора.The fewer objects allocated on the heap, the less work the garbage collector has to do. При размещении объектов не используйте округленные значения, превышающие фактические потребности, например не выделяйте 32 байта, когда необходимо только 15 байтов.When you allocate objects, don't use rounded-up values that exceed your needs, such as allocating an array of 32 bytes when you need only 15 bytes.

Активированный процесс сборки мусора освобождает память, занятую неиспользуемыми объектами.When a garbage collection is triggered, the garbage collector reclaims the memory that's occupied by dead objects. Процесс освобождения сжимает используемые объекты, чтобы они перемещались вместе, и удаляет пространство, занятое неиспользуемыми объектами, уменьшая, таким образом, кучу.The reclaiming process compacts live objects so that they are moved together, and the dead space is removed, thereby making the heap smaller. Это гарантирует, что объекты, распределенные совместно, останутся в управляемой куче рядом, чтобы сохранить локальность.This ensures that objects that are allocated together stay together on the managed heap to preserve their locality.

Степень вмешательства (частота и длительность) сборок мусора зависит от числа распределений и сохранившейся в управляемой куче памяти.The intrusiveness (frequency and duration) of garbage collections is the result of the volume of allocations and the amount of survived memory on the managed heap.

Кучу можно рассматривать как совокупность двух куч: куча больших объектов и куча маленьких объектов.The heap can be considered as the accumulation of two heaps: the large object heap and the small object heap. Куча больших объектов содержит объекты размером от 85 000 байтов, обычно представленные массивами.The large object heap contains objects that are 85,000 bytes and larger, which are usually arrays. Экземпляр объекта редко бывает очень большим.It's rare for an instance object to be extremely large.

Совет

Вы можете настроить пороговый размер для объектов, помещаемых в кучу больших объектов.You can configure the threshold size for objects to go on the large object heap.

ПоколенияGenerations

Алгоритм сборки мусора учитывает следующее:The GC algorithm is based on several considerations:

  • Уплотнять память для части управляемой кучи быстрее, чем для всей кучи.It's faster to compact the memory for a portion of the managed heap than for the entire managed heap.
  • У новых объектов время жизни меньше, а старых больше.Newer objects have shorter lifetimes and older objects have longer lifetimes.
  • Новые объекты теснее связаны друг с другом, и приложение обращается к ним приблизительно в одно и то же время.Newer objects tend to be related to each other and accessed by the application around the same time.

Сборка мусора в основном сводится к уничтожению короткоживущих объектов с небольшим временем жизни.Garbage collection primarily occurs with the reclamation of short-lived objects. Для оптимизации производительности сборщика мусора управляемая куча делится на три поколения: 0, 1 и 2. Следовательно, объекты с большим и небольшим временем жизни обрабатываются отдельно.To optimize the performance of the garbage collector, the managed heap is divided into three generations, 0, 1, and 2, so it can handle long-lived and short-lived objects separately. Сборщик мусора хранит новые объекты в поколении 0.The garbage collector stores new objects in generation 0. Уровень объектов, созданных на раннем этапе работы приложения и оставшихся после сборок мусора, повышается, и они сохраняются в поколении 1 и 2.Objects created early in the application's lifetime that survive collections are promoted and stored in generations 1 and 2. Так как сжать часть управляемой кучи быстрее, чем всю кучу, эта схема позволяет сборщику мусора освобождать память в определенном поколении, а не для всей кучи при каждой сборке мусора.Because it's faster to compact a portion of the managed heap than the entire heap, this scheme allows the garbage collector to release the memory in a specific generation rather than release the memory for the entire managed heap each time it performs a collection.

  • Поколение 0.Generation 0. Это самое молодое поколение содержит короткоживущие объекты.This is the youngest generation and contains short-lived objects. Примером короткоживущего объекта является временная переменная.An example of a short-lived object is a temporary variable. Сборка мусора чаще всего выполняется в этом поколении.Garbage collection occurs most frequently in this generation.

    Вновь распределенные объекты образуют новое поколение объектов и неявно являются сборками поколения 0.Newly allocated objects form a new generation of objects and are implicitly generation 0 collections. Однако если это большие объекты, то они попадают в кучу больших объектов, которая иногда называется поколением 3.However, if they are large objects, they go on the large object heap (LOH), which is sometimes referred to as generation 3. Поколение 3 — это физическое поколение, которое логически собирается как часть поколения 2.Generation 3 is a physical generation that's logically collected as part of generation 2.

    Большинство объектов уничтожается при сборке мусора для поколения 0 и не доживает до следующего поколения.Most objects are reclaimed for garbage collection in generation 0 and don't survive to the next generation.

    Если приложение пытается создать новый объект, когда поколение 0 заполнено, сборщик мусора выполняет сбор, чтобы попытаться освободить адресное пространство для объекта.If an application attempts to create a new object when generation 0 is full, the garbage collector performs a collection in an attempt to free address space for the object. Сборщик мусора начинает проверять объекты в поколении 0, а не все объекты в управляемой куче.The garbage collector starts by examining the objects in generation 0 rather than all objects in the managed heap. Сборка мусора только в поколении 0 зачастую освобождает достаточно памяти для того, чтобы приложение могло и дальше создавать новые объекты.A collection of generation 0 alone often reclaims enough memory to enable the application to continue creating new objects.

  • Поколение 1.Generation 1. Это поколение содержит коротко живущие объекты и служит буфером между короткоживущими и долгоживущими объектами.This generation contains short-lived objects and serves as a buffer between short-lived objects and long-lived objects.

    Когда сборщик мусора выполняет сборку для поколения 0, память уплотняется для достижимых объектов и они продвигаются в поколение 1.After the garbage collector performs a collection of generation 0, it compacts the memory for the reachable objects and promotes them to generation 1. Так как объекты, оставшиеся после сборки, обычно склонны к долгой жизни, имеет смысл продвинуть их в поколение более высокого уровня.Because objects that survive collections tend to have longer lifetimes, it makes sense to promote them to a higher generation. Сборщику мусора необязательно выполнять повторную проверку объектов поколений 1 и 2 при каждой сборке мусора поколения 0.The garbage collector doesn't have to reexamine the objects in generations 1 and 2 each time it performs a collection of generation 0.

    Если сборка поколения 0 не освобождает достаточно памяти, чтобы приложение могло создать новый объект, сборщик мусора может выполнить сборку мусора поколения 1, а затем поколения 2.If a collection of generation 0 does not reclaim enough memory for the application to create a new object, the garbage collector can perform a collection of generation 1, then generation 2. Объекты в поколении 1, оставшиеся после сборок, продвигаются в поколение 2.Objects in generation 1 that survive collections are promoted to generation 2.

  • Поколение 2.Generation 2. Это поколение содержит долгоживущие объекты.This generation contains long-lived objects. Примером долгоживущих объектов служит объект в серверном приложении, содержащий статические данные, которые существуют в течение длительности процесса.An example of a long-lived object is an object in a server application that contains static data that's live for the duration of the process.

    Объекты в поколении 2, оставшиеся после сборки, находятся там до тех пор, пока они не станут недостижимыми в следующей сборке.Objects in generation 2 that survive a collection remain in generation 2 until they are determined to be unreachable in a future collection.

    Объекты в куче больших объектов (иногда называемой поколением 3) также собираются в поколении 2.Objects on the large object heap (which is sometimes referred to as generation 3) are also collected in generation 2.

Сборки мусора выполняются для конкретных поколений при выполнении соответствующих условий.Garbage collections occur on specific generations as conditions warrant. Сборка поколения означает сбор объектов в этом поколении и во всех соответствующих младших поколениях.Collecting a generation means collecting objects in that generation and all its younger generations. Сборка мусора поколения 2 также называется полной сборкой, так как при этом уничтожаются объекты во всех поколениях (то есть все объекты в управляемой куче).A generation 2 garbage collection is also known as a full garbage collection, because it reclaims objects in all generations (that is, all objects in the managed heap).

Выживание и переходыSurvival and promotions

Объекты, которые не уничтожаются при сборке мусора, называются выжившими объектами и переходят в следующее поколение.Objects that are not reclaimed in a garbage collection are known as survivors and are promoted to the next generation:

  • Объекты, оставшиеся после сборки мусора поколения 0, подвигаются в поколение 1.Objects that survive a generation 0 garbage collection are promoted to generation 1.
  • Объекты, оставшиеся после сборки мусора поколения 1, подвигаются в поколение 2.Objects that survive a generation 1 garbage collection are promoted to generation 2.
  • Объекты, оставшиеся после сборки мусора поколения 2, остаются в поколении 2.Objects that survive a generation 2 garbage collection remain in generation 2.

Когда сборщик мусора обнаруживает высокую долю выживания в поколении, он повышает порог распределений для этого поколения.When the garbage collector detects that the survival rate is high in a generation, it increases the threshold of allocations for that generation. При следующей сборке мусора освобождается заметная часть занятой памяти.The next collection gets a substantial size of reclaimed memory. В среде CLR непрерывно контролируется равновесие двух приоритетов: не позволить рабочему набору приложения стать слишком большим, задерживая сборку мусора, и не позволить сборке мусора выполняться слишком часто.The CLR continually balances two priorities: not letting an application's working set get too large by delaying garbage collection and not letting the garbage collection run too frequently.

Эфемерные поколения и сегментыEphemeral generations and segments

Так как объекты в поколениях 0 и 1 являются короткоживущими, эти поколения называются эфемерными поколениями.Because objects in generations 0 and 1 are short-lived, these generations are known as the ephemeral generations.

Эфемерные поколения выделяются в сегменте памяти, который называется эфемерным сегментом.Ephemeral generations are allocated in the memory segment that's known as the ephemeral segment. Каждый новый сегмент, полученный сборщиком мусора, становится новым эфемерным сегментом и содержит объекты, пережившие сборку мусора для поколения 0.Each new segment acquired by the garbage collector becomes the new ephemeral segment and contains the objects that survived a generation 0 garbage collection. Старый эфемерный сегмент становится новым сегментом поколения 2.The old ephemeral segment becomes the new generation 2 segment.

Размер эфемерного сегмента зависит от того, является ли система 32- или 64-разрядной, и от типа сборщика мусора (сборка мусора рабочей станции или сервера).The size of the ephemeral segment varies depending on whether a system is 32-bit or 64-bit and on the type of garbage collector it is running (workstation or server GC). В следующей таблице показаны размеры эфемерного сегмента по умолчанию.The following table shows the default sizes of the ephemeral segment.

Сборка мусора рабочей станции и сервераWorkstation/server GC 32-разрядная версия32-bit 64-разрядная версия64-bit
Сборщик мусора рабочей станцииWorkstation GC 16 МБ16 MB 256 МБ256 MB
Сборщик мусора сервераServer GC 64 МБ64 MB 4 Гбайт4 GB
Сборщик мусора сервера с более чем 4 логическими ЦПServer GC with > 4 logical CPUs 32 МБ32 MB 2 ГБ2 GB
Сборщик мусора сервера с более чем 8 логическими ЦПServer GC with > 8 logical CPUs 16 МБ16 MB 1 ГБ1 GB

Этот эфемерный сегмент может содержать объекты поколения 2.The ephemeral segment can include generation 2 objects. Объекты поколения 2 могут использовать несколько сегментов (столько, сколько требуется процессу и сколько разрешает память).Generation 2 objects can use multiple segments (as many as your process requires and memory allows for).

Объем памяти, освобождаемой при эфемерной сборке мусора, ограничен размером эфемерного сегмента.The amount of freed memory from an ephemeral garbage collection is limited to the size of the ephemeral segment. Освобождаемый объем памяти пропорционален пространству, занятому неиспользуемыми объектами.The amount of memory that is freed is proportional to the space that was occupied by the dead objects.

Процесс сборки мусораWhat happens during a garbage collection

Сборка мусора состоит из следующих этапов:A garbage collection has the following phases:

  • Этап маркировки, выполняющий поиск всех используемых объектов и составляющий их перечень.A marking phase that finds and creates a list of all live objects.

  • Этап перемещения, обновляющий ссылки на сжимаемые объекты.A relocating phase that updates the references to the objects that will be compacted.

  • Этап сжатия, освобождающий пространство, занятое неиспользуемыми объектами и сжимающий выжившие объекты.A compacting phase that reclaims the space occupied by the dead objects and compacts the surviving objects. На этапе сжатия объекты, пережившие сборку мусора, перемещаются к более старому концу сегмента.The compacting phase moves objects that have survived a garbage collection toward the older end of the segment.

    Так как сборки поколения 2 могут занимать несколько сегментов, объекты, перешедшие в поколение 2, могут быть перемещены в более старый сегмент.Because generation 2 collections can occupy multiple segments, objects that are promoted into generation 2 can be moved into an older segment. Выжившие объекты поколений 1 и 2 могут быть перемещены в другой сегмент, так как они перешли в поколение 2.Both generation 1 and generation 2 survivors can be moved to a different segment, because they are promoted to generation 2.

    Как правило, куча больших объектов (LOH) не сжимается, так как копирование больших объектов приводит к снижению производительности.Ordinarily, the large object heap (LOH) is not compacted, because copying large objects imposes a performance penalty. Однако в .NET Core и в .NET Framework 4.5.1 и более поздних версиях можно использовать свойство GCSettings.LargeObjectHeapCompactionMode для сжатия большой кучи объектов по требованию.However, in .NET Core and in .NET Framework 4.5.1 and later, you can use the GCSettings.LargeObjectHeapCompactionMode property to compact the large object heap on demand. Кроме того, куча больших объектов автоматически сжимается при установке жесткого ограничения с помощью одного из следующих параметров:In addition, the LOH is automatically compacted when a hard limit is set by specifying either:

Чтобы определить, являются ли объекты используемыми, сборщик мусора задействует следующие сведения.The garbage collector uses the following information to determine whether objects are live:

  • Корни стека.Stack roots. Переменные стека, предоставленные JIT-компилятором и средством обхода стека.Stack variables provided by the just-in-time (JIT) compiler and stack walker. JIT-оптимизация позволяет уменьшить или увеличить области кода, в которых переменные стека сообщаются сборщику мусора.JIT optimizations can lengthen or shorten regions of code within which stack variables are reported to the garbage collector.

  • Дескрипторы сборки мусора.Garbage collection handles. Дескрипторы, которые указывают на управляемые объекты и которые могут быть выделены пользовательским кодом или средой CLR.Handles that point to managed objects and that can be allocated by user code or by the common language runtime.

  • Статические данные.Static data. Статические объекты в доменах приложений, которые могут ссылаться на другие объекты.Static objects in application domains that could be referencing other objects. Каждый домен приложения следит за своими статическими объектами.Each application domain keeps track of its static objects.

Перед запуском сборки мусора все управляемые потоки, кроме потока, запустившего сборку мусора, приостанавливаются.Before a garbage collection starts, all managed threads are suspended except for the thread that triggered the garbage collection.

На следующем рисунке показан поток, запускающий сборку мусора и вызывающий приостановку других потоков.The following illustration shows a thread that triggers a garbage collection and causes the other threads to be suspended.

Когда поток запускает сборку мусора

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

Для большинства объектов, созданных приложением, сборщик мусора автоматически выполнит необходимые задачи по управлению памятью.For most of the objects that your application creates, you can rely on garbage collection to automatically perform the necessary memory management tasks. Однако для неуправляемых ресурсов требуется явная очистка.However, unmanaged resources require explicit cleanup. Основным типом неуправляемых ресурсов являются объекты, образующие упаковку для ресурсов операционной системы, такие как дескриптор файлов, дескриптор окна или сетевое подключение.The most common type of unmanaged resource is an object that wraps an operating system resource, such as a file handle, window handle, or network connection. Хотя сборщик мусора может отслеживать время жизни управляемого объекта, инкапсулирующего неуправляемый ресурс, он не знает, как освобождать эти ресурсы.Although the garbage collector is able to track the lifetime of a managed object that encapsulates an unmanaged resource, it doesn't have specific knowledge about how to clean up the resource.

При создании объекта, инкапсулирующего неуправляемый ресурс, рекомендуется предоставлять необходимый код для очистки неуправляемого ресурса в общем методе Dispose.When you create an object that encapsulates an unmanaged resource, it's recommended that you provide the necessary code to clean up the unmanaged resource in a public Dispose method. Предоставление методаDispose дает возможность пользователям объекта явно освобождать память при завершении работы с объектом.By providing a Dispose method, you enable users of your object to explicitly free its memory when they are finished with the object. Когда используется объект, инкапсулирующий неуправляемый ресурс, вызовите Dispose при необходимости.When you use an object that encapsulates an unmanaged resource, make sure to call Dispose as necessary.

Кроме того, нужно предусмотреть способ освобождения неуправляемых ресурсов в случае, если потребитель типа не вызовет Dispose.You must also provide a way for your unmanaged resources to be released in case a consumer of your type forgets to call Dispose. Вы можете использовать защищенный обработчик для создания оболочки для неуправляемого ресурса или переопределить метод Object.Finalize().You can either use a safe handle to wrap the unmanaged resource, or override the Object.Finalize() method.

См. сведения об очистке неуправляемых ресурсов.For more information about cleaning up unmanaged resources, see Clean up unmanaged resources.

См. такжеSee also