Según tengo entendido, solo hay un montón (irónicamente, generalmente se lo representa como una pila). Los objetos se promocionan a la generación 1 no cuando se llena la generación 0, sino cuando sobreviven a una colección. En resumen, las referencias no se "mueven", la ubicación utilizada para identificar dónde se mueve la generación termina.
Cuando la pila se acerca a estar lleno, algunas cosas ocurren:
- Cada generación se recoge, a partir de 0 y terminando con 2.
- Si la recolección de la generación 0 es suficiente, no va a recoger la generación 1 y 2.
- Si la recolección de la generación 0 no es suficiente, pero la recolección de la generación 1 es, no va a recoger la generación 2.
- El montón se compacta (vacíos se eliminan)
- Promover generaciones
- Generación 1 supervivientes etiquetados como la generación 2.
- Generación 0 supervivientes etiquetados como la generación 1.
Los objetos que sobreviven a la colección se mueven luego a la generación 0 (si este es su primer ciclo de recolección) o la generación 2 (si han sobrevivido a más de una colección). Esto se hace por el bien de la eficiencia, para garantizar que no tratemos constantemente de recolectar objetos de larga vida.
No se queda sin espacio en formas específicas de generación. See this article para una buena explicación.
No olvide que los objetos grandes (85,000 bytes o más) comenzarán en la Generación 2. – RichardOD