Coleccionista G1
En comparación con otros recopiladores, el recopilador G1 tiene las siguientes características:
Cuando se utiliza el recopilador G1, el diseño de la memoria del montón de Java es diferente al de otros recopiladores (nueva generación). y la vieja generación) son muy diferentes. Divide todo el montón de Java en regiones independientes de igual tamaño. Aunque todavía conserva los conceptos de nueva generación y vieja generación, la nueva generación y la vieja generación ya no están físicamente aisladas, sino que son una colección de algunas áreas.
G1 es capaz de establecer un modelo de tiempo de pausa predecible porque puede evitar sistemáticamente la recolección de basura de áreas enteras del montón de Java. G1 rastrea el valor de basura acumulado de cada área, mantiene una lista de prioridades en segundo plano y prioriza el área con el mayor valor de recolección según el tiempo de recolección permitido. Este método de utilizar regiones para dividir el espacio de memoria y recuperar áreas prioritarias garantiza que el recopilador G1 obtenga la mayor eficiencia de recopilación en un tiempo limitado.
La idea de G1 de "dividir la memoria en varias partes" parece simple y fácil de entender, pero sus detalles de implementación están lejos de ser tan simples como se imagina. Después de dividir el montón de Java en varias áreas, ¿puede el recolector de basura realmente recolectar basura en diferentes áreas? En primer lugar, las regiones no pueden existir aisladas. A un objeto se le asigna un valor en un área. No solo pueden hacer referencia a él otros objetos en esta área, sino también cualquier objeto en el montón de Java. Entonces, al realizar un análisis de accesibilidad para determinar si un objeto está vivo, ¿no es necesario escanear todo el montón de Java para garantizar la precisión?
En el recopilador G1, la máquina virtual utiliza conjuntos de memoria para evitar escaneos completos del montón en busca de referencias entre objetos en la región y entre objetos antiguos y nuevos en otros recopiladores. Cada región en G1 tiene un conjunto de memoria correspondiente. Cuando la máquina virtual descubre que un programa está escribiendo datos de un tipo de referencia, genera una barrera de escritura para interrumpir temporalmente la operación de escritura y verifica si el objeto al que hace referencia la referencia está en un área diferente. Si es así, la información de referencia relevante se registra en el conjunto de memoria del área a la que pertenece el objeto referenciado a través de CardTable. Al reciclar memoria, agregar la memoria establecida dentro del rango de enumeración del nodo raíz del GC puede garantizar que no se escanee todo el montón y no se pierda nada.
Si no se cuentan las operaciones de mantenimiento del conjunto de memoria, la operación del recopilador G1 se puede dividir aproximadamente en los siguientes pasos:
En la fase de marcado inicial, solo se puede marcar asociarse directamente con el objeto raíz de GC y modificar el valor de TAMS (el siguiente superior al comienzo de la etiqueta) para que el nuevo objeto pueda crearse en el área disponible correcta durante la ejecución simultánea del programa de usuario en la siguiente fase . Esta etapa requiere detener el hilo, pero el tiempo requerido es muy corto.
La fase de marcado concurrente analiza la accesibilidad de los objetos en el montón a partir de la raíz del GC y encuentra los objetos supervivientes. Esta fase lleva mucho tiempo, pero se puede ejecutar al mismo tiempo que el hilo del usuario.
La fase de calificación final consiste en corregir la parte del registro de calificación que ha cambiado debido a que los subprocesos del usuario continúan ejecutándose durante la fase de calificación simultánea. La máquina virtual registra los cambios de objetos durante este período en el registro del conjunto de memoria del subproceso, y la marca final debe fusionar los datos del registro del conjunto de memoria con el conjunto de memoria. En esta etapa, los subprocesos del usuario deben pausarse, pero pueden ejecutarse simultáneamente.
La última etapa es la etapa de selección y reciclaje. Primero, se clasifican el valor y el costo de reciclaje de cada área y se formula un plan de reciclaje de acuerdo con el tiempo de pausa del GC deseado por el usuario. Según la información filtrada por Oracle, esta etapa también se puede ejecutar en paralelo con el hilo del usuario. Sin embargo, dado que solo se restaura una parte del área y el tiempo lo controla el usuario, detener el hilo del usuario mejorará en gran medida la recopilación. eficiencia.