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