Автоматический сборщик мусора в .NET работает, периодически сканируя память приложения для определения, какие объекты всё ещё используются, а какие больше не нужны. 2 Объекты, которые больше не используются, помечаются для сборки мусора, и их память автоматически освобождается сборщиком. 2
Процесс работы сборщика мусора включает несколько этапов: 2
- Этап разметки. 2 Создаётся список всех действующих объектов путём следования ссылкам от всех корневых объектов. 2 Все объекты, которых нет в списке активных объектов, потенциально удаляются из памяти кучи. 2
- Этап перемещения. 2 Ссылки на все объекты, которые были в списке всех действующих объектов, обновляются таким образом, чтобы они указывали на новое местоположение, куда объекты будут перемещены на этапе уплотнения. 2
- Фаза уплотнения. 2 Куча уплотняется по мере освобождения пространства, занятого мёртвыми объектами, и перемещения оставшихся живых объектов. 2 Все живые объекты, оставшиеся после сборки мусора, перемещаются в более старый конец кучи памяти в их первоначальном порядке. 2
Для эффективной работы с объектами различной «старости» сборщик мусора использует концепцию поколений (поколения 0, 1 и 2): 3
- При создании объекты помещаются в поколение 0. 3
- Когда поколение 0 заполнено — запускается сборка мусора. 3 Неиспользуемые объекты удаляются, оставшиеся перемещаются в поколение 1. 3
- Аналогично происходит сборка мусора, когда заполнено поколение 1. 3 Все выжившие объекты перемещаются в поколение 2. 3 Затем происходит сборка мусора в поколении 0. 3
- Когда заполнено поколение 2, происходит полная сборка мусора. 3 Сперва очищается поколение 2, а затем 1 и 0. 3 Если после этого недостаточно места для новых объектов — происходит исключение OutOfMemory. 3
- В самом конце происходит фаза сжатия, в которой сборщик мусора перемещает живые объекты так, чтобы они располагались в памяти непосредственно друг за другом. 3