Si está realmente interesado en cómo funcionan los recolectores de basura, puedo recomendar los 2 libros de Richard Jones sobre la recolección de basura. Los enlaces/referencias son here. Esto no es específicamente sobre la recolección de basura de Java.
(tengo una copia del libro mayor, y el nuevo que está en mi lista de compras.)
Aquí es una versión simple de cómo un colector copia se ocupa de este problema.
Un colector de copia funciona al copiar objetos de un espacio (el del espacio) a otro (el espacio).
Específicamente, el GC recorre el gráfico de los objetos alcanzables dentro del espacio "desde", comenzando desde cada una de las raíces de la GC. Cada vez que encuentra una referencia a un nodo (en un campo de instancia, campo estático, marco de pila, etc.), comprueba el objeto al que apunta la referencia para ver si se ha marcado como visitado.
Si aún no está marcada, la GC hace lo siguiente:
- Marca el objeto en el espacio de.
- Copia el objeto en el espacio.
- Almacena la dirección del objeto en el espacio en el objeto del espacio. (Esto es como una dirección de reenvío).
- Visita recursivamente cada campo de referencia de la copia de espacio del objeto.
El resultado de esto es la referencia al objeto to-space.
Si el objeto ya se ha marcado, el GC busca la dirección de reenvío y la devuelve.
La ubicación (en-espacio, o alguna raíz GC) donde el GC tiene la referencia de se actualiza con el puntero al objeto en-espacio.
Si sigue todo eso, verá que el GC no necesita ir a buscar todos los lugares que contienen una referencia a un objeto movido dado. En cambio, simplemente encuentra todos los lugares en el cruce de los objetos alcanzables. Por supuesto, el GC hace tiene que hacer ese recorrido, pero hay varias técnicas para reducir la cantidad de desplazamiento que se necesita hacer en cada ciclo de GC.
Si no ha seguido lo anterior, entonces POR FAVOR, lea uno de los libros de texto que he recomendado. Harán un trabajo mucho mejor de explicarlo de lo que yo puedo hacer. También encontrará material sobre cómo otros tipos de GC tratan este tema.
Los Java HotSpot GC son todos los coleccionistas de copiado de una forma u otra.Las cosas se vuelven un poco más complicadas que mi descripción anterior para la recopilación paralela y concurrente, pero el mecanismo de "reenvío de direcciones" es común para todas ellas.
(no hay muchos trabajos publicados u otra documentación pública sobre HotSpot GC, y la mayor parte del material que existe asume que el lector tiene una buena comprensión de lo moderna obra recolectores de basura.)
Pregunta similar: http://stackoverflow.com/questions/88852/does-the-java-vm-move-objects-in-memory-and-if-so-how – sleske