.Net Review
.Net Сборщик мусора. Как работает?
Одним из основных вопросов на собеседовании на позицию .Net разработчика выше уровня middle включая, спрашивают о том, как работает сборщик мусора. Подробнее об этом в этой статье.
Предисловие
Прежде чем разбирать работу сборщика мусора, необходимо понимать, как .Net работает с памятью. Все переменные хранятся или в стеке, или в куче. Если кратко, то в стеке хранятся значимые типы и ссылки на переменные ссылочного типа. В куче хранятся данные ссылочных типов.
Как это работает?
Данные утилизируются, когда в них отпадает надобность. Но как понять, когда в них отпадает надобность? .Net проверяет, в каком контексте находится переменная или данные, нужны ли они будут в будущем.
В случае, как на картинке переменная dataFilter закончит своё существование после завершения выполнения функции. А filteredData продолжит своё существование.
Это же ресурсозатратно!
Чем больше переменных, тем более ресурсозатратным становится слежения за их состоянием. Для решения этой проблемы в .Net используется система поколений.
Каждый объект в системе относится к одному из 3 поколений. Основное правило - чем дольше объект в системе, тем меньше вероятность его зачистки. Поколения:
- Поколение 0. Регистрируется объект, ещё не помеченный в сборщике мусора.
- Поколение 1. Регистрируется объект, помеченный в сборщике мусора и выживший после зачистки нулевого поколения.
- Поколение 2. Регистрируется объект, который пережил более двух зачисток.
Сборщик мусора проверяет объекты нулевого поколения и очищает ненужные. Выжившие объекты переходят на первое поколение. Если есть недостаток памяти и объекты первого поколения очищены, то происходит проверка объектов первого поколения. Выжившие получают статус второго поколения. Если памяти до сих пор не хватает и были произведены проверки 0 и 1 поколения, то происходит проверка и зачистка объектов второго поколения.
Итог
Таким образом зачистка происходит чаще с новыми объектами. Также в C# предусмотрена работа с памятью (библиотека System.GС), однако не встречал кейсов, когда необходимо в C# вручную работать с памятью, т.к. одним из плюсов работы с данным языком является именно автоматизация этого процесса.
Спасибо за внимание!
Наш телеграмм канал: https://t.me/dotnetreview
Источники: Wiki.