Сборка мусора известна как автоматическое освобождение хранилища (т.е.) это процесс освобождения памяти, используемой объектами, на которые больше не ссылаются. Это делается по-разному и по-разному на разных платформах и языках.

Поэтому, когда программа запускается, система выделяет память для ее выполнения. CLR хранит объекты в двух разных местах: STACK и HEAP.

  • HEAP — отслеживает все объекты
  • STACK — отслеживает переменные, которые используются в программе во время выполнения, а также имеет ссылку на кучу.

Как распределяется память?

Внутри GC память разделена на три части,

  • Поколение 0 — Маленькие по размеру — Короткоживущие объекты
  • Поколение 1 — средний размер — буфер от 0 до 2
  • Поколение 2 — Большие по размеру — Долгоживущие объекты

Что происходит, когда создается новый объект?

  1. CLR найдет байты, необходимые для хранения объекта или типа в куче.
  2. Он добавляет байты, необходимые для служебных данных объекта (например, Pointer & BlockIndex, это зависит от типа процессора, используемого системой).
  3. NextObjPtr содержит адрес следующего объекта, который будет помещен в кучу.
  4. После вычисления байтов, если объект помещается в куче, CLR выделяет память для объекта, а затем возвращает адрес.
  5. Также перемещает NextObjPtr по следующему адресу, где должен быть размещен следующий новый объект.

Все это всегда будет происходить в поколении 0.

Как ГК собирает?

Итак, что происходит, если объект не вписывается в поколение 0, тогда в игру вступает GC.

  1. Сборщик мусора сначала проверяет поколение 0 и помечает объект на основе срока службы и объема объектов.
  2. Затем сборщик мусора сканирует все поколение 0 и удаляет отмеченные объекты из памяти.
  3. После удаления объектов он реструктурирует память (т.е. сжимает память).
  4. Затем объекты из поколения 0 перемещаются в поколение 1.
  5. Затем он опустошает Поколение 0.

Теперь Поколение 0 полностью доступно для размещения объектов. То же самое происходит для поколения 1 при перемещении объектов из поколения 0, если поколение 1 заполнено, элементы поколения 1 будут перемещены в поколение 2.

У вас есть этот вопрос?

Что происходит, когда все поколения заполнены? Да, возникает MemoryOutofRangeException.

Сборщик мусора будет вызываться автоматически. Если вам нужно вызвать метод сбора вручную, вызовите GC.Collect(). Пожалуйста, перейдите по ссылкам ниже для получения дополнительной информации.

Ссылки: MSDN, GC Collect