.Net Review
.Net Review
Канал о технологиях .Net и не только. Здесь вы найдете разборы, уроки, фишки технологий и языков программирования... https://t.me/dotnetreview
Читать 1 минуту

.Net Сборщик мусора. Как работает?

Image for post

Одним из основных вопросов на собеседовании на позицию .Net разработчика выше уровня middle включая, спрашивают о том, как работает сборщик мусора. Подробнее об этом в этой статье.

Предисловие

Прежде чем разбирать работу сборщика мусора, необходимо понимать, как .Net работает с памятью. Все переменные хранятся или в стеке, или в куче. Если кратко, то в стеке хранятся значимые типы и ссылки на переменные ссылочного типа. В куче хранятся данные ссылочных типов.

Как это работает?

Данные утилизируются, когда в них отпадает надобность. Но как понять, когда в них отпадает надобность? .Net проверяет, в каком контексте находится переменная или данные, нужны ли они будут в будущем.

Image for post

В случае, как на картинке переменная dataFilter закончит своё существование после завершения выполнения функции. А filteredData продолжит своё существование.

Это же ресурсозатратно!

Чем больше переменных, тем более ресурсозатратным становится слежения за их состоянием. Для решения этой проблемы в .Net используется система поколений.

Каждый объект в системе относится к одному из 3 поколений. Основное правило - чем дольше объект в системе, тем меньше вероятность его зачистки. Поколения:

  • Поколение 0. Регистрируется объект, ещё не помеченный в сборщике мусора.
  • Поколение 1. Регистрируется объект, помеченный в сборщике мусора и выживший после зачистки нулевого поколения.
  • Поколение 2. Регистрируется объект, который пережил более двух зачисток.

Сборщик мусора проверяет объекты нулевого поколения и очищает ненужные. Выжившие объекты переходят на первое поколение. Если есть недостаток памяти и объекты первого поколения очищены, то происходит проверка объектов первого поколения. Выжившие получают статус второго поколения. Если памяти до сих пор не хватает и были произведены проверки 0 и 1 поколения, то происходит проверка и зачистка объектов второго поколения.

Итог

Таким образом зачистка происходит чаще с новыми объектами. Также в C# предусмотрена работа с памятью (библиотека System.GС), однако не встречал кейсов, когда необходимо в C# вручную работать с памятью, т.к. одним из плюсов работы с данным языком является именно автоматизация этого процесса.

Спасибо за внимание!

Наш телеграмм канал: https://t.me/dotnetreview

Источники: Wiki.

483 просмотра
Добавить
Еще
.Net Review
Канал о технологиях .Net и не только. Здесь вы найдете разборы, уроки, фишки технологий и языков программирования... https://t.me/dotnetreview
Подписаться