Esto parece una pregunta simple, pero después de leer mucho sobre el tema, todavía no he encontrado una respuesta definitiva (tal vez porque es muy simple).
Mi pregunta es esta: cuando un recolector de basura compacta objetos en el montón, ¿cómo se actualizan las referencias a esos objetos en la pila? Se me ocurren dos posibles soluciones:
- Revise la pila (y las referencias en el montón) y actualice la referencia para apuntar a la nueva ubicación del objeto. En una analogía con la mudanza, esto sería como enviar una carta a cualquier persona que tenga su dirección y pedirles que actualicen su libreta de direcciones con su nueva dirección.
- Proporcione algún tipo de tabla de consulta. Esto sería como dejar una dirección de reenvío con la oficina de correos local.
¿Los recolectores de basura utilizan predominantemente uno de estos dos métodos? ¿Algún otro método? ¿Ambos?
garbage-collection
todorojo
fuente
fuente
Respuestas:
No tengo experiencia específica en esto, pero entiendo que generalmente se usa el primer método.
El recolector de basura tiene que analizar la pila de todos modos para encontrar a qué cosas del montón se hace referencia desde la pila. Una vez que decide mover algo, tiene que corregir las referencias a él de todos modos, y no hay ninguna razón para diferenciar entre el montón y la pila en ese punto.
El enfoque de la tabla de búsqueda en principio podría funcionar. Sin embargo, eso haría que todos los accesos de puntero necesiten tomar 2 pasos. Eso sería un gran impacto en el rendimiento en los tiempos de ejecución normales. Particularmente para el caso de uso de muchos objetos pequeños. (Que es un caso en el que los programas de GC de última generación generalmente superan el conteo de referencias).
fuente