Сборка мусора поколений против сборки мусора в .NET - PullRequest
1 голос
/ 20 марта 2012

Я читал о GC и понял, что GC работает не одним способом, а двумя?

Первый - это обычный GC: * ​​1003 *

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

Второй - GC поколения:

  1. Сканирование объектов и обнаружение объектов, которые нужно освободить, и удаление их
  2. Передача тех, кто выжил, поколению 2 (чтобы сканировать их реже)
  3. Передача наиболее выжившим объектам поколению3.

Я совершенно сбит с толку: это два разных типа GC?Или поколение GC это как апгрейд первого?Или это то же самое?

Как работает .NET?

Ответы [ 2 ]

1 голос
/ 19 апреля 2014

Ваш первый пункт применим, когда деструктор / финализатор реализован внутри вашего класса.Его запись будет добавлена ​​в очередь завершения во время инициализации объекта.Когда на этот объект больше не ссылается корень GC (например, ссылки на стек, ссылки на статические объекты, регистры ЦП ...) , кроме очереди завершения / fReachable (оба действуют как корень GC), тогда эта запись перемещаетсяв доступную очередь.Эта очередь контролируется отдельным потоком, который отвечает за вызов метода finalize этого объекта.

Следующая ссылка является окончательным справочным материалом для понимания управления памятью в среде .NET.Первые две главы (около 40 страниц) дадут вам отличное и глубокое представление о том, как работает сборка мусора в среде .NET.Больше всего это БЕСПЛАТНО электронная книга.

Под капотом .NET Memory Management Крис Фаррелл и Ник Харрисон

Прямая ссылка

Я рекомендую эту книгу всем .NET-парням, которые хотят писать эффективные программы с использованием технологии .NET.

1 голос
/ 20 марта 2012

.NET является поколением в значительной степени, как вы описали. «Нечто» запускает проход GC. Оставшиеся в живых после этого прохода повышаются до следующего поколения и так далее до поколения 2 (начиная с поколения 0, поэтому всего 2 повышения).

GC проходит выше в поколениях меньше, потому что они могут быть дороже.

Этот блог (и многие другие источники в сети) дает хороший обзор GC в .NET:

http://dotnetfacts.blogspot.co.uk/2008/05/how-garbage-collector-works-part-1.html

http://dotnetfacts.blogspot.co.uk/2008/05/how-garbage-collector-works-part-2.html

То, что вы описали, кажется, две половины истории .NET. Я полагаю, что ваш обзор о финализаторе и внутренних очередях (свободно доступных) в основном точен (не уверен), как и поведение генерации.

Этот ТАК вопрос также опускает нос в похожих водах:

Сборка мусора в реализации .Net, поведение объектов неизвестно, невозможно понять их поведение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...