Насколько я понимаю, есть только одна куча (по иронии судьбы, она обычно изображается в виде стека). Объекты переводятся в поколение 1 не тогда, когда поколение 0 заполняется, а когда они переживают коллекцию. Вкратце, ссылки не «перемещаются», местоположение, используемое для определения места окончания генерации, перемещается.
Когда куча приближается к заполнению, происходит несколько вещей:
- Каждое поколение собирается, начиная с 0 и заканчивая 2.
- Если коллекции поколения 0 достаточно, она не будет собирать поколения 1 и 2.
- Если коллекции поколения 0 недостаточно, но коллекции поколения 1 есть, она не будет собирать поколение 2.
- Куча сжимается (пробелы удаляются)
- Продвигать поколения
- выжившие поколения 1 помечены как поколение 2.
- Выжившие поколения 0 помечены как поколение 1.
Объекты, которые выжили в коллекции, затем перемещаются в поколение 0 (если это их первый цикл сбора) или поколение 2 (если они пережили более одной коллекции). Это сделано для эффективности, чтобы мы не пытались постоянно собирать долгоживущие объекты.
Вы не исчерпываете пространство в определенных поколениях способах. См. Эту статью для хорошего объяснения.