que - java gc generations
Java GC: Por qué dos espacios de supervivientes (1)
Esta pregunta ya tiene una respuesta aquí:
- Java GC: ¿por qué dos regiones sobrevivientes? 6 respuestas
En la mayoría de los tutoriales en línea, podemos ver que muestran que hay dos espacios de supervivencia en GC. ¿Cuál es la necesidad de tener dos espacios de supervivencia cuando realmente podemos tener solo uno? ¿Cuáles son los impactos en el rendimiento al tener dos espacios de supervivencia?
La razón es que lo estás adivinando, rendimiento. Permítanme primero explicar por qué existen los espacios de sobrevivientes. Hay dos diseños principales de recolectores de basura con respecto a la preocupación esencial de la reubicación de objetos :
un colector de compactación in situ;
un recolector de copias
El colector de copias puede operar más rápido y se puede paralelizar eficientemente, básicamente porque nunca sobrescribe ningún objeto. No puede lograr eso sin utilizar un espacio de montón "activo" y otro "inactivo", estas dos funciones de conmutación después de cada ejecución de GC.
Diseño básico de un colector copiador
Nota: lo que sigue no es una descripción del GC real de HotSpot, sino más bien aquellos aspectos del mismo que son parte del diseño original tal como fue presentado en un documento de ACM de 1970 por CJ Cheney. HotSpot agrega más refinamientos, uno de los cuales es la adición del espacio Eden que se explica a continuación.
Cuando se inicia un procedimiento de recopilación de copias, hay dos espacios involucrados:
- Desde el espacio: un bloque contiguo de memoria dividido en dos regiones:
- sobrevivientes del último GC;
- objetos nuevos (creados desde el último GC);
- Para espaciar: completamente vacío.
La tarea de la ejecución del GC es identificar todos los objetos supervivientes en el espacio De y copiarlos en el espacio Para .
A medida que se construye el espacio A , el espacio Desde se evacuará por completo y no es necesario que se escriba nada.
La copia de GC es de un solo pase
Una ventaja clave del colector de copias es que es de un solo paso: simplemente escaneamos todas las raíces de GC, copiamos todos esos objetos y luego escaneamos esos objetos para obtener referencias adicionales, copiando todos los referentes. Nunca volvemos a visitar ningún objeto y no necesitamos ninguna estructura de memoria de soporte. (Mire aquí para una buena explicación de esto).
Punteros hacia adelante
A medida que se reubica cada objeto superviviente, la ubicación anterior se puede marcar con un puntero de reenvío y esta información se puede usar de manera eficiente a medida que los objetos supervivientes se escanean en busca de referencias a los objetos reubicados, y esas referencias se actualizan. La referencia anterior apunta al puntero hacia adelante, por lo que el nuevo valor del puntero se encuentra a solo una búsqueda de distancia.
¿Por qué el tercer espacio?
Su pregunta, "¿por qué hay dos espacios de supervivencia?" en realidad sería mejor expresarlo, "¿por qué un espacio Eden separado?".
HotSpot ha introducido el espacio Eden como una optimización que mantiene constante la capacidad de la nueva región de asignación, apostando al resultado de que una gran proporción de los objetos se convertirá inmediatamente en basura. Puedes ver Eden como una parte de la memoria compartida entre los dos espacios, la parte que probablemente se liberará en el siguiente GC. Esto en realidad mejora la utilización de la memoria.