Что происходит во время сборки мусора, если поколение 2 заполнено?

Я перечитываю CLR через C# прямо сейчас, и у вас есть вопросы о сборке мусора в .NET. В книге после заполнения поколения 0 запускается сборка мусора и перемещает все ожидающие ссылки на объекты в поколение 1.

То же самое происходит, когда поколение 1 заполнено. Но что происходит, когда заполняется второе поколение? Других поколений для перемещения ссылок нет. Расширяется ли размер поколения 2 с помощью среды CLR?


person spkenny    schedule 27.05.2009    source источник
comment
Не забывайте, что большие объекты (85 000 байт или больше) будут начинаться с поколения 2.   -  person RichardOD    schedule 28.05.2009


Ответы (3)


Да, он расширит размер поколения 2, если сможет. Если свободного места больше нет, вы получите OutOfMemoryException.

person Andrew Hare    schedule 27.05.2009

Различные поколения сборки мусора связаны не с определенным размером, а с возрастом мусора. Насколько я знаю, ни у одного из поколений нет ограничений по размеру.

person Brian    schedule 27.05.2009

Насколько я понимаю, есть только одна куча (по иронии судьбы, ее обычно изображают в виде стека). Объекты переходят в поколение 1 не тогда, когда заполняется поколение 0, а когда они выживают в коллекции. Короче говоря, ссылки не «перемещаются», перемещается местоположение, используемое для определения того, где заканчивается генерация.

Когда куча приближается к заполнению, происходит несколько вещей:

  1. Each generation is collected, starting from 0 and ending with 2.
    • If collection of generation 0 is sufficient, it will not collect generation 1 and 2.
    • Если коллекции поколения 0 недостаточно, а коллекции поколения 1 достаточно, она не будет собирать поколение 2.
  2. Куча уплотнена (пробелы удалены)
  3. Promote generations
    • Generation 1 survivors are tagged as generation 2.
    • Выжившие из поколения 0 помечаются как поколение 1.

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

У вас не заканчивается пространство в зависимости от поколения. см. эту статью для хорошего объяснения.

person Michael Meadows    schedule 27.05.2009
comment
Я не верю, что существует какая-либо маркировка объектов как таковая. CLR отслеживает, какие сегменты используются разными поколениями, поэтому все наоборот. CLR может определить создание объекта по его расположению в управляемой куче. - person Brian Rasmussen; 27.05.2009
comment
@ Брайан, извините, если я не ясно выразился, я хотел сказать, что среда выполнения отслеживает, где заканчивается каждое поколение, поэтому объекты, добавленные в кучу выше тех, принадлежат более низкому поколению. Я уверен, что упрощаю, но вы правы, нет отслеживания для каждого объекта того, какое это поколение. - person Michael Meadows; 27.05.2009
comment
Сборка мусора запускается, когда нулевое поколение заполнено, поэтому я думаю, что ошибки нет. - person spkenny; 27.05.2009
comment
@spkenny, поскольку куча непрерывна, сборка мусора запускается, когда куча заполнена. Во время первого сбора нулевое поколение — это вся ваша куча, но по мере перемещения объектов в более высокие поколения они по-прежнему вносят свой вклад в использование кучи, поэтому емкость нулевого поколения эффективно сокращается. - person Michael Meadows; 27.05.2009