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