Что происходит во время сбора мусора, если поколение 2 заполнено? - PullRequest
13 голосов
/ 27 мая 2009

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

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

Ответы [ 3 ]

20 голосов
/ 27 мая 2009

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

3 голосов
/ 27 мая 2009

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

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

  1. Каждое поколение собирается, начиная с 0 и заканчивая 2.
    • Если коллекции поколения 0 достаточно, она не будет собирать поколения 1 и 2.
    • Если коллекции поколения 0 недостаточно, но коллекции поколения 1 есть, она не будет собирать поколение 2.
  2. Куча сжимается (пробелы удаляются)
  3. Продвигать поколения
    • выжившие поколения 1 помечены как поколение 2.
    • Выжившие поколения 0 помечены как поколение 1.

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

Вы не исчерпываете пространство в определенных поколениях способах. См. Эту статью для хорошего объяснения.

3 голосов
/ 27 мая 2009

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

...