Recolector de basura y asignación de memoria (Capítulo 5)

"Máquina virtual Java práctica: diagnóstico de fallas de JVM y optimización del rendimiento (segunda edición)"
Plataforma Java, edición estándar Guía de ajuste de recolección de basura de máquinas virtuales Hotspot

Aunque parece haber una gran cantidad de recolectores de basura, de hecho, la lógica general es que un producto ha evolucionado debido a la actualización del entorno de hardware. La producción de diferentes recolectores de basura se puede dividir en varias etapas.

  • Era de la colección de un solo subproceso (Serial y Serial Old)
  • Era de la recopilación multiproceso (Parallel Scanvenge y Parallel Old)
  • Era de recopilación concurrente (ParNew y CMS)
  • Era de recopilación concurrente inteligente (G1)

La recolección de basura se divide en recolección generacional y recolección de particiones:

  • Reciclaje generacional: Serial, Serial Old, Parallel Scavenge, Parallel Old, ParNew, CMS
  • Reciclaje de particiones: G1, ZGC, Shenandoah

Capítulo 5 Recolector de basura y asignación de memoria

5.1. Coleccionista en serie (una cosa a la vez)

1. Utilice un solo hilo para la recolección de basura. Solo hay un hilo de trabajo para cada colección; es un recolector maduro y extremadamente eficiente que ha sido probado en un entorno de producción a largo plazo; 2. Características: enfoque y exclusividad
3.
Aplicable escenarios: computadoras con capacidades paralelas débiles
4. escenarios utilizables: nueva generación y generación anterior
5. clasificación:
según los diferentes espacios del montón, se divide en recopilador en serie de nueva generación y recopilador en serie de generación anterior.

5.1.1 Colector serie de nueva generación - Serie

1. El recolector de basura más antiguo y uno de los más básicos de JDK
2. Características:

  • Utilice un único hilo para la recolección de basura;
  • Recolección exclusiva de basura;

3. Adopte un algoritmo de copia; la implementación es relativamente simple, el procesamiento lógico es particularmente eficiente y no hay sobrecarga de cambio de subprocesos; 4.
Cuando la plataforma de hardware, como un solo procesador de CPU, no es particularmente superior, el rendimiento puede exceder el recolector paralelo y recolector concurrente;
5. Use -XX:+UseSerialGCparámetros para especificar el uso del recolector en serie de nueva generación o el recolector en serie de generación anterior; cuando la JVM se ejecuta en modo Cliente, es el recolector de basura predeterminado; 6. Nota: Aunque el recolector en
serie El recolector de basura es viejo, existe desde hace mucho tiempo. Probado. En la mayoría de los casos, su rendimiento es bastante bueno;

Cuando el recolector en serie realiza la recolección de basura, los subprocesos de la aplicación Java deben pausarse y esperar a que se complete la recolección de basura. Como se muestra en la Figura 5.1, cuando el recopilador en serie se está ejecutando, todos los subprocesos de la aplicación dejan de funcionar y esperan. Este fenómeno se llama "Stop-The-World". Provocará una experiencia de usuario muy mala, que a menudo es inaceptable en escenarios de aplicaciones con altos requisitos de tiempo real.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

5.1.2 Colector serial de vieja generación - Serial Old

1. Utilice un algoritmo de compresión de marcas
2. Al igual que el recolector en serie, es un recolector de basura en serie y exclusivo;

3. Para habilitar el recopilador en serie en la generación anterior, puede intentar usar los siguientes parámetros:
-XX:+UseSerialGC: Use el recopilador en serie tanto en la nueva generación como en la generación anterior;
-XX:+UseParNewGC: Use el recopilador ParNew en la nueva generación y use el recopilador en serie recopilador en la generación anterior; (JDK9, JDK10 se han eliminado porque ParNew necesita funcionar con CMS, y CMS ha sido reemplazado por G1 y ya no admite este parámetro):
-XX:+UseParallelGCla nueva generación usa el recopilador ParallelGC y la generación anterior usa el coleccionista en serie;

Dado que la recolección de basura de la generación anterior generalmente lleva más tiempo que la recolección de la generación más joven, en aplicaciones con un gran espacio de almacenamiento dinámico, una vez que se inicia el recolector en serie de la generación anterior, es probable que la aplicación se detenga durante mucho tiempo.
Aun así, como recolector de basura veterano, el recolector en serie de antigua generación se puede usar junto con una variedad de recolectores de nueva generación y también se puede usar como recolector de respaldo para el recolector CMS.
Insertar descripción de la imagen aquí

5.2 Colector paralelo (más gente, más poder)

1. El recolector paralelo mejora el recolector en serie y utiliza múltiples subprocesos para realizar la recolección de basura al mismo tiempo;
2. Para computadoras con fuertes capacidades paralelas, puede acortar efectivamente el tiempo real requerido para la recolección de basura;

5.2.1 Colector de nueva generación - ParNew

1. Funciona en la nueva generación;
2. Simplemente realiza múltiples subprocesos en el recolector en serie, y su estrategia de reciclaje, algoritmo y parámetros son los mismos que los del recolector en serie de nueva generación;
3. Recolector exclusivo, durante el proceso de recolección, Aplicaciones. todos serán suspendidos;

El recolector paralelo utiliza múltiples subprocesos para la recolección de basura. Por lo tanto, en una CPU con capacidades de concurrencia fuertes, el tiempo de pausa que genera es más corto que el del recolector en serie. Por otro lado, en sistemas con CPU o capacidades de concurrencia débiles, el recolector paralelo El efecto del colector no será mejor que el del colector en serie. Debido a la presión del subproceso múltiple, es probable que su rendimiento real sea peor que el del colector en serie;
Insertar descripción de la imagen aquí

4. Puede usar los parámetros para encender el reciclador ParNew:
-XX:+UseParNewGCLa nueva generación usa el reciclador ParNew y la generación anterior usa el reciclador en serie; (JDK9 y JDK10 se han eliminado porque ParNew necesita funcionar con CMS y CMS tiene ha sido reemplazado por G1 y ya no es compatible. Este parámetro es compatible)
-XX:+UseConcMarkSweepGC: la nueva generación usa el recolector de basura ParNew y la generación anterior usa CMS; (no se recomiendan JDK9 y JDK10, y se recomienda usar el recolector de basura G1 predeterminado)
5 Puede utilizar -XX:ParallelGCThreadsparámetros para especificar el número de subprocesos durante el trabajo. Generalmente, es mejor hacer coincidir la cantidad de CPU para evitar demasiados subprocesos, lo que puede afectar el rendimiento de la recolección de basura. De forma predeterminada, cuando el número de CPU es inferior a 8, el valor de ParallelGCThreads es igual al número de CPU. Cuando el número de CPU es mayor que 8, el valor de ParallelGCThreads es igual a 3+((5*CPU_Count) /8);
Insertar descripción de la imagen aquí

5.2.2 Colector de nueva generación - ParallelGC

1. Adopta un algoritmo de copia;
2. Al igual que el recopilador ParNew, es multiproceso y exclusivo;
3. Características: presta gran atención al rendimiento del sistema;
4. El recopilador ParallelGC de nueva generación se puede habilitar usando lo siguiente parámetros::
-XX:+UseParallelGCUtilizado por el recopilador ParallelGC de nueva generación, la generación anterior usa el recopilador en serie;: La nueva generación usa
-XX:+UseParallelOldGCel recopilador ParallelGC, la generación anterior usa el recopilador ParallelOldGC;
5. El recopilador ParallelGC proporciona dos parámetros importantes para controlar el rendimiento de el sistema:
-XX:MaxGCPauseMillis: Establece el tiempo máximo de pausa de recolección de basura, el valor es un número entero > 0; cuando Parallel está funcionando, ajustará el tamaño del montón de Java u otros parámetros para controlar el tiempo de pausa dentro de MaxGCPauseMillis tanto como sea posible. Un valor pequeño hará que la recolección de basura se vuelva muy frecuente, lo que aumentará el tiempo total de recolección de basura y reducirá el rendimiento;:
-XX:GCTimeRatioestablezca el tamaño del rendimiento, el valor es un número entero entre 0 y 100; suponiendo que el valor de GCTimeRatio es n, el sistema no dedicará más de 1/(1+n) del tiempo utilizado para la recolección de basura; de forma predeterminada, el valor es 99, es decir, no se utilizará más de 1/(1+99) = 1% del tiempo para recolección de basura;

Otra diferencia entre ParallelGC y ParNew es que también admite una estrategia de ajuste de GC adaptativo; su uso -XX:+UseAdaptiveSizePolicypuede activar la estrategia de GC adaptativa; en este modo, el tamaño de la nueva generación, la proporción del área del Edén y el área de sobreviviente, promoción Parámetros como la antigüedad de los objetos en la generación anterior se ajustan automáticamente para lograr un equilibrio entre el tamaño del montón, el rendimiento y el tiempo de pausa. En situaciones donde el ajuste manual es difícil, puede utilizar directamente este método adaptativo, especificando solo el montón máximo de la JVM, el rendimiento objetivo (GCTimeRatio) y el tiempo de pausa (MaxGCPauseMillis), y dejar que la JVM complete el trabajo de ajuste por sí misma.
Insertar descripción de la imagen aquí

6. Los -XX:MaxGCPauseMillisparámetros -XX:GCTimeRatioson contradictorios entre sí. Si reduce el tiempo máximo de pausa de una recolección, también reducirá el rendimiento del sistema. Aumentar el rendimiento del sistema también puede aumentar el tiempo máximo de pausa de una recolección de basura;

5.2.3 Colector de vieja generación - ParallelOldGC

1. Concurrencia de subprocesos múltiples
2. Al igual que el recopilador de nueva generación ParallelGC, también es un recopilador que se centra en el rendimiento 3.
El recopilador de antigua generación se utiliza junto con ParallelGC y el recopilador de nueva generación
4. Utilice el método de compresión de marcas ; en JDK1. Solo se puede usar en 6;
5. Parámetros::
-XX:+UseParallelOldGCUse el recolector ParallelGC en la nueva generación y use el recolector ParallelOldGC en la generación anterior; (Este es un par de recolectores de basura que prestan gran atención al rendimiento , y puede considerarse en sistemas que son sensibles al rendimiento.Uso)
-XX:ParallelGCThreads: se puede utilizar para establecer el número de subprocesos durante la recolección de basura;
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

5.3 Reciclador CMS (multitarea sin perder el ritmo) (JDK8 y versiones anteriores)

1. Preste atención al tiempo de pausa del sistema.
2.CMS es la abreviatura de Concurrent Mark Sweep, que significa limpieza de marcas concurrente
3. Adoptar el método de limpieza de marcas
4. Reciclaje paralelo de subprocesos múltiples;

5.3.1 Principales pasos de trabajo del CMS

1. Los pasos principales cuando funciona CMS son: marcado inicial, marcado concurrente, limpieza previa, remarcado, borrado concurrente y reinicio concurrente; 2.
Marcado inicial y remarcado de recursos exclusivos del sistema; limpieza previa, marcado concurrente, concurrente La limpieza y el restablecimiento de la concurrencia se pueden realizar con subprocesos de usuario.
3. En general, CMS no es exclusivo y puede realizar recolección de basura mientras la aplicación se está ejecutando.
Insertar descripción de la imagen aquí

Según el método de marcar y barrer, el marcado inicial, el marcado concurrente y el remarcado se utilizan para marcar los objetos que deben reciclarse. La limpieza concurrente consiste en reciclar formalmente los objetos basura una vez que se completa el marcado. El restablecimiento simultáneo se refiere a reinicializar la estructura de datos y los datos del CMS después de que se completa la recolección de basura para prepararse para la siguiente recolección de basura. El marcado de simultaneidad, la limpieza de simultaneidad y el restablecimiento de simultaneidad se pueden realizar con subprocesos de aplicación.
Durante todo el proceso de reciclaje de CMS, de forma predeterminada, habrá una operación de limpieza previa después del marcado simultáneo (el interruptor también se puede apagar -XX:-CMSPrecleaningEnabledpara no realizar la limpieza previa). La prelimpieza es concurrente, además de preparar y verificar la limpieza formal, también intenta controlar el tiempo de pausa. Dado que el comentario es exclusivo de la CPU, si se activa un comentario inmediatamente después de que ocurre el GC de generación joven, el tiempo de pausa puede ser muy largo. Para evitar esta situación, el preprocesamiento esperará deliberadamente a que ocurra un GC de nueva generación, luego predecirá el momento en que puede ocurrir el próximo GC de nueva generación en función de los datos históricos de rendimiento y volverá a marcar el tiempo entre la hora actual y la prevista. tiempo. Esto puede intentar evitar la coincidencia del GC de nueva generación y el remarcado, y reducir el tiempo de pausa tanto como sea posible.

5.3.2 Parámetros principales del CMS

1.: -XX:+UseConcMarkSweepGCHabilitar el reciclador de CMS;
2 -XX:ParallelGCThreads.: Establecer el número de subprocesos utilizados en el GC paralelo. Si la nueva generación usa ParNew, ParallelGCThreads también es el número de subprocesos del GC de nueva generación; el número predeterminado de subprocesos simultáneos iniciados es (ParallelGCThreads +3)/4; Esto significa que cuando hay 4 ParallelGCThreads, solo hay 1 subproceso concurrente, y cuando hay dos subprocesos concurrentes, hay 5-8 subprocesos ParallelGCThreads; 3. , : Establece
el -XX:ConcGCThreadsnúmero -XX:ParallelCMSThreadsde subprocesos concurrentes;
4 Nota:
(1) Concurrencia: se refiere a la ejecución alternativa del recopilador y los subprocesos de la aplicación;
(2) Paralelo: se refiere a la detención de la aplicación y varios subprocesos ejecutan GC al mismo tiempo; (el recopilador paralelo no es concurrente)

Dado que el recopilador de CMS no es un recopilador exclusivo, la aplicación sigue funcionando continuamente durante el proceso de reciclaje de CMS. Durante el proceso de trabajo de la aplicación se seguirá generando basura. Esta basura recién generada no se puede eliminar durante el proceso actual de reciclaje de CMS. Al mismo tiempo, debido a que la aplicación no se interrumpe, también debe asegurarse de que la aplicación tenga suficiente memoria disponible durante el proceso de reciclaje del CMS. Por lo tanto, el recolector de CMS no esperará a que la memoria del montón esté saturada antes de realizar la recolección de basura, sino que comenzará a reciclar cuando el uso de la memoria del montón alcance un cierto umbral para garantizar que la aplicación todavía tenga suficiente espacio para soportar el proceso de trabajo del CMS. La aplicación se ejecuta.

5.: -XX:CMSInitiatingOccupancyFractionEspecifique el umbral de reciclaje, el valor predeterminado es 68, es decir, cuando el uso de espacio de la generación anterior alcance el 68%, se realizará un reciclaje de CMS;

Si el uso de memoria de la aplicación aumenta rápidamente y se produce memoria insuficiente durante la ejecución del CMS, el reciclaje del CMS fallará y la máquina virtual iniciará el recolector en serie de antigua generación para la recolección de basura. En este punto, la aplicación se interrumpirá por completo hasta que se complete la recolección de basura, momento en el cual la aplicación puede estar en pausa durante un largo tiempo.

Dependiendo de las características de la aplicación, se pueden -XX:CMSInitiatingOccupancyFractionajustar los parámetros. Si el crecimiento de la memoria es lento, puede establecer un valor ligeramente mayor. Un umbral mayor puede reducir efectivamente la frecuencia de activación del CMS y reducir la cantidad de reciclaje de la generación anterior, lo que puede mejorar significativamente el rendimiento de la aplicación. Por otro lado, si el uso de memoria de la aplicación está creciendo rápidamente, este umbral debe reducirse para evitar que se active con frecuencia el recopilador en serie de antigua generación.

6.CMS se basa en el método de marcar y borrar, que generará una gran cantidad de fragmentos de memoria y el espacio discreto disponible no se puede asignar a objetos más grandes. Como se muestra en la Figura 5.5 a continuación, en este caso, incluso si a la memoria del montón todavía le queda un gran espacio restante, es posible que se vea obligada a realizar una recolección de basura a cambio de una parte de la memoria contigua disponible. Este fenómeno es bastante perjudicial para el rendimiento del sistema. Para resolver este problema, el recolector de CMS proporciona varios parámetros para la compresión y desfragmentación de la memoria: permite que el CMS realice
-XX:+UseCMSCompactAtFullCollectionuna desfragmentación de la memoria una vez completada la recolección de basura. La intercalación no se realiza simultáneamente
-XX:CMSFullGCsBeforeCompaction;: se puede utilizar para establecer cuántas veces se realiza el reciclaje de CMS antes de realizar la compresión de memoria;
Insertar descripción de la imagen aquí

5.3.3 Análisis de registros de CMS

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquíEsto muestra que el reciclador de CMS no pudo reciclar al mismo tiempo. Lo más probable es que esto se deba a que no hay suficiente espacio en la generación anterior mientras se ejecuta la aplicación. Si hay fallas de modo concurrentes muy frecuentes durante el proceso de trabajo de CMS, debe considerar hacer ajustes y reservar un espacio de generación anterior más grande tanto como sea posible. O puede establecer un parámetro -XX:CMSInitiatingOccupancyFraction más pequeño para reducir el umbral de activación del CMS, de modo que el CMS todavía tenga un gran espacio libre de generación anterior para que las aplicaciones lo utilicen durante la ejecución.

5.3.4 Reciclaje de Clase

Cuando utilice el reciclador de CMS, si necesita reciclar el área permanente, de forma predeterminada, debe activar un GC completo, como se muestra a continuación:

Insertar descripción de la imagen aquí
-XX:+CMSClassUnloadingEnabled: Utilice el reciclador de CMS para reciclar el área Perm. Después de usar este parámetro, si las condiciones lo permiten, el sistema utilizará el mecanismo CMS para reciclar los datos de Clase en el área Perm. El registro es el siguiente:
Insertar descripción de la imagen aquí

5.4 Recolector G1 (lo decidiré en el futuro) (recolector predeterminado para JDK9 y versiones posteriores)

1. El recolector de basura G1 (Garbage-First) es un recolector de basura nuevo que se utiliza oficialmente en JDK1.7 para reemplazar al recolector CMS.
2. G1 tiene una estrategia de recolección de basura única, que es completamente diferente de los recolectores anteriores;
3. Es un recolector de basura generacional, que distingue entre la generación joven y la generación anterior, y todavía tiene el área del Edén y el área de sobrevivientes;
4 .Utiliza un algoritmo de partición; No requiere que toda el área del Edén, la generación joven o la generación anterior sean continuas; 5.
Características:
(1) Paralelismo : durante el reciclaje, varios subprocesos de GC funcionan al mismo tiempo; (Uso efectivo de múltiples -potencia informática central)
(2) Concurrencia : Tiene la capacidad de ejecutarse alternativamente con la aplicación, parte del trabajo está disponible y la aplicación se ejecuta al mismo tiempo. En términos generales, la aplicación no se bloqueará por completo durante todo el reciclaje. período; (3)
GC generacional : teniendo en cuenta tanto la generación joven como la generación anterior; (Otro reciclaje El servidor funciona en la generación joven o en la generación anterior); (4
) Desfragmentación espacial : durante el proceso de reciclaje, apropiado Se llevarán a cabo movimientos de objetos. Cada reciclaje copiará efectivamente los objetos y reducirá el espacio fragmentado; a diferencia de CMS, simplemente marque el objeto de limpieza, y después de varios GC, CMS debe realizar una desfragmentación; (5) Previsibilidad: debido a
razones de partición , G1 solo puede seleccionar algunas áreas para el reciclaje de memoria, lo que reduce el alcance del reciclaje y las pausas globales también pueden obtener un mejor control;

5.4.1 División de memoria G1 y proceso de recopilación principal

1.G1 divide el montón en áreas. Durante cada reciclaje, solo se reciclan unas pocas áreas para controlar el tiempo de pausa causado por la recolección de basura; 2. El proceso de reciclaje puede tener 4 etapas: (1)
GC
de nueva generación;
(2) Ciclo de marca concurrente;
(3) Recolección mixta;
(4) Se puede realizar GC completo si es necesario;

5.4.2 GC de nueva generación de G1

1. Trabajo principal: reciclar el área del Edén y el área de sobrevivientes;
2. Después del reciclaje: el área del Edén se vacía, parte del área de sobrevivientes se recicla y existe al menos un área de sobrevivientes; el área de generación anterior aumenta (parte del área de sobrevivientes se promocionan objetos del área o del área del Edén);

Insertar descripción de la imagen aquí
Después de que se produce el GC de nueva generación, si la opción PrintGCDetails está activada, puede obtener un registro de GC similar al siguiente:
Insertar descripción de la imagen aquí
En comparación con los registros de otros recopiladores, el contenido del registro de G1 es muy rico. Por supuesto, lo que más nos preocupa sigue siendo el tiempo de pausa del GC y la situación del reciclaje. Como se puede ver en el registro, el área del Edén originalmente ocupaba 235 MB de espacio. Se vació después del reciclaje. El área de sobrevivientes creció de 5 MB a 11 MB. Esto se debe a que algunos objetos se copiaron del área del Edén al área de sobrevivientes. El montón totalizó 400 MB. La memoria del montón cayó de 239 MB antes del reciclaje a 10,5 MB.

5.4.3 Ciclo de marcado concurrente de G1

1. La fase de concurrencia es similar a CMS: para reducir el tiempo de pausa, las partes que pueden ser concurrentes con la aplicación se extraen y ejecutan por separado; 2.
El ciclo de marcado concurrente se divide en pasos:

  • Marcado inicial : marcar objetos directamente accesibles desde el nodo raíz. Esta etapa irá acompañada de un GC de nueva generación, que provocará una pausa global, en esta etapa el hilo del programa de referencia debe dejar de ejecutarse;
  • Escaneo del área raíz : escanee el área de generación anterior a la que puede acceder directamente el área de supervivientes y marque estos objetos directamente accesibles. Este proceso se puede ejecutar al mismo tiempo que la aplicación, pero no se puede ejecutar al mismo tiempo que el GC de nueva generación (porque el escaneo del área raíz depende de los objetos en el área sobreviviente, y el GC de nueva generación modificará esta área). si necesita realizar el GC de nueva generación, debe esperar al área raíz. Solo se puede realizar después de que se complete el escaneo. En este caso, el tiempo del GC de nueva generación se extenderá;
  • Marcado concurrente : similar al CMS, el marcado concurrente escaneará y encontrará objetos vivos en todo el montón y los marcará; este es un proceso concurrente y puede ser interrumpido por un GC de nueva generación;
  • Volver a marcar : al igual que CMS, volver a marcar también provocará pausas en la aplicación; dado que la aplicación aún se está ejecutando durante el proceso de marcado concurrente, es posible que sea necesario corregir los resultados de la marca, por lo que los últimos resultados de la marca se complementan aquí; en En G1, este proceso se completa utilizando el algoritmo STAB (instantánea al comienzo), es decir, G1 creará una instantánea del objeto superviviente al comienzo del marcado, que ayuda a acelerar el remarcado;
  • Limpieza exclusiva : Esta etapa provocará pausas. Calculará los objetos supervivientes y las tasas de reciclaje de GC en cada área, los clasificará e identificará las áreas disponibles para el reciclaje mixto; en esta etapa, también actualizará el conjunto de memoria (Conjunto Recordado); esta etapa proporciona las áreas que necesitan ser reciclados mixtos y están etiquetados, esta información es requerida durante la fase de reciclaje mixto;
  • Limpieza concurrente : La limpieza concurrente no provocará pausas, se identificarán y limpiarán áreas completamente libres;

La Figura 5.7 muestra cómo podría verse el montón antes y después de un ciclo de marcado simultáneo. Dado que el ciclo de marcado concurrente incluye un GC de nueva generación, la nueva generación se clasificará. Sin embargo, dado que la aplicación aún se está ejecutando cuando se ejecuta el ciclo de marcado concurrente, se utilizará un nuevo espacio del área del Edén después de que finalice el ciclo de marcado concurrente. La mayor diferencia antes y después del ciclo de calificación concurrente es que después de esta fase, el sistema agrega algunas áreas marcadas con G. Estas regiones están marcadas porque contienen una alta proporción de basura y se espera que se recopilen en GC mixtos posteriores (tenga en cuenta que estas regiones no se recolectan oficialmente durante el ciclo de marca concurrente). Estas áreas a reciclar serán registradas por G1 en un conjunto llamado Conjuntos de Recolección.
Insertar descripción de la imagen aquí
El flujo de trabajo general de la fase de reciclaje concurrente se muestra en la Figura 5.8. Se puede ver que además del marcado inicial, el remarcado y la limpieza exclusiva, se pueden ejecutar varias otras fases simultáneamente con la aplicación; durante el ciclo de marcado concurrente, G1 generará el siguiente registro
Insertar descripción de la imagen aquí
:
(1) Marca inicial, que va acompañada de un GC de nueva generación. Se puede ver que cuando se inicializa la marca inicial, el área del Edén se vacía y se copia parcialmente al área de sobreviviente; (2)
Insertar descripción de la imagen aquí
A escaneo concurrente del área raíz, el proceso de escaneo concurrente no puede ser utilizado por la interrupción del GC de nueva generación; el escaneo del área raíz no causará pausas; (3) Marcado concurrente
Insertar descripción de la imagen aquí
, el GC de nueva generación puede interrumpir el marcado concurrente. El siguiente registro muestra que uno el marcado simultáneo fue interrumpido por tres GC de nueva generación;
Insertar descripción de la imagen aquí
(4) El remarcado provocará una pausa global y su registro es el siguiente:
Insertar descripción de la imagen aquí
(5) Después del remarcado, se realizará una limpieza exclusiva. La limpieza exclusiva recalculará los supervivientes objetos en cada área, y de esta manera, se puede obtener el efecto de GC en cada área (es decir, tasa de reciclaje). Su registro es el siguiente:
Insertar descripción de la imagen aquí
(6) La limpieza concurrente se ejecuta al mismo tiempo y reciclará directamente las áreas que ya no contienen objetos supervivientes en función del número de objetos supervivientes en cada área calculado durante la fase de limpieza exclusiva. Su registro es el siguiente:
Insertar descripción de la imagen aquí

5.4.4 Reciclaje mixto

Durante el ciclo de marcas concurrentes, aunque algunos objetos se reciclan, en general, la tasa de reciclaje es bastante baja. Sin embargo, después del ciclo de marcado concurrente, G1 sabe claramente qué áreas contienen más objetos de basura y puede reciclar específicamente estas áreas durante la fase de recolección mixta. Por supuesto, G1 dará prioridad a las áreas de reciclaje con una mayor proporción de basura, porque reciclar estas áreas también es más rentable. De aquí proviene el nombre G1. El nombre completo del recolector de basura G1 es Garbage First Garbage Collector, que se traduce literalmente como recolector de basura con prioridad de basura. Garbage First aquí se refiere a dar prioridad al área con la mayor proporción de basura durante el reciclaje.

Esta etapa se llama reciclaje mixto porque durante esta etapa, se seleccionan para el reciclaje tanto el GC de generación joven normal como algunas áreas marcadas de generación anterior, y procesa tanto la generación nueva como la generación anterior, como se muestra en la Figura 5.9. Debido al GC de nueva generación, se debe limpiar el área del Edén y, además, se limpian dos áreas con la proporción de basura más alta marcada como G. Los objetos supervivientes en el área limpia se trasladarán a otras áreas, lo que tiene la ventaja de que puede reducir la fragmentación del espacio.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
El GC mixto se ejecutará varias veces hasta que se recupere suficiente espacio de memoria y luego activará un GC de nueva generación. Después del GC de nueva generación, puede ocurrir el procesamiento de un ciclo de marcado concurrente y, finalmente, se producirá la ejecución del GC mixto. El proceso completo podría parecerse a la Figura 5.10.
Insertar descripción de la imagen aquí

5.4.5 GC completo cuando sea necesario

1. Al igual que CMS, el reciclaje concurrente no puede evitar por completo la falta de memoria durante el proceso de reciclaje en situaciones particularmente ocupadas porque la aplicación y los subprocesos de GC funcionan alternativamente. Cuando se encuentre con esta situación, G1 también se transferirá a un GC completo;
2. Cuando G1 esté marcado al mismo tiempo, debido a que la generación anterior se llena rápidamente, G1 finalizará el marcado concurrente y se transferirá a un GC completo;
3. Si es mixto Espacio insuficiente durante la GC, o durante la GC de nueva generación, el área de supervivientes y la generación anterior no pueden acomodar objetos supervivientes, lo que conducirá a una GC completa;

5.4.6 Registro G1

Un registro completo de nueva generación G1 es el siguiente:
Insertar descripción de la imagen aquí
(1) La primera línea del registro indica que se produjo un GC de nueva generación 1,619 segundos después de que se inició la aplicación, esto ocurrió durante la marca inicial y tomó 0,038 segundos, lo que significa que la aplicación Se detuvo durante al menos 0,038 segundos;
(2) La segunda línea proporciona el tiempo paralelo posterior. Indica el tiempo total empleado por todos los subprocesos de GC, aquí es 38 milisegundos;
(3) Las líneas tercera y cuarta dan el estado de ejecución de cada subproceso de GC. Esto representa un total de 4 subprocesos de GC (porque la primera fila tiene 4 datos) y todos se inician en 1619,3 segundos. Al mismo tiempo, también se dan los valores estadísticos de estos datos de inicio, como promedio (Avg), mínimo (Min), máximo (Max) y diferencia (Diff). Diff representa la diferencia entre el valor máximo y el valor mínimo;
(4) Las líneas quinta y sexta dan el consumo de tiempo del escaneo raíz. Durante el escaneo raíz, el consumo de tiempo de cada subproceso de GC consume 0,3, 0,3, 0,2 y 0,2 segundos respectivamente. La última línea proporciona estas estadísticas que consumen mucho tiempo;
(5) Las líneas 789 y 90 dan el tiempo necesario para actualizar el Conjunto Recordado. El conjunto de memoria es una estructura de datos mantenida en G1, denominada RS. Cada región G1 tiene un RS asociado. Dado que G1 recicla por área, por ejemplo, cuando recicla objetos en el área A, es probable que no se reciclen los objetos en el área B. Para reciclar objetos en el área A, se debe escanear el área B o incluso todo el montón para determinar qué objetos están en el área A. No es accesible y el costo de hacerlo es obviamente alto. Por lo tanto, G1 registra los objetos a los que hacen referencia otras áreas en el área A en el RS del área A. De esta manera, al reciclar el área A, solo necesita considerar RS como parte del conjunto raíz del área A, evitando así la necesidad de haga un escaneo completo del montón. Dado que las relaciones de referencia entre objetos pueden cambiar todo el tiempo durante la ejecución del sistema, para realizar un seguimiento más eficiente de estas relaciones de referencia, estos cambios se registrarán en los buffers de actualización. Los búferes procesados ​​aquí se refieren al procesamiento de datos de los búferes de actualización. Los 4 tiempos indicados aquí también son el tiempo que tardan 4 subprocesos de GC, así como sus estadísticas. Se puede ver en este registro que la actualización de RS toma 5,7, 5,4, 28 y 5,3 milisegundos respectivamente, con un tiempo promedio de 11,1 milisegundos; (6) Las
líneas 11 y 12 indican el tiempo para escanear RS;
(7) En el formato formal Al reciclar, G1 evacuará los objetos en el área reciclada, es decir, colocará los objetos supervivientes en otras áreas, por lo que los objetos deben copiarse. La copia del objeto dada en las líneas 13 y 14 es el tiempo necesario para la asignación del objeto;
( 8) Las líneas 15, 16, 17 y 18 brindan la información de terminación del subproceso de trabajo de GC. El tiempo de terminación aquí es el tiempo que pasa el hilo en la fase de terminación. Antes de que finalice el subproceso de GC, verificarán las colas de trabajo de otros subprocesos de GC para ver si todavía hay referencias de objetos que no se han procesado. Si otros subprocesos aún tienen datos sin procesar, el subproceso de GC que solicitó la terminación lo ayudará a completarlo. tan pronto como sea posible. Luego intente finalizar nuevamente. Entre ellos, Intentos de terminación muestra la cantidad de veces que cada subproceso de trabajo intenta terminar;
(9) Las líneas 19 y 20 muestran el tiempo de finalización del subproceso de trabajo de GC. Aquí se muestra que estos subprocesos finalizaron 1657 milisegundos después de que el sistema se estaba ejecutando; (10) Las líneas
21 y 22 muestran el tiempo El tiempo de supervivencia de un trabajador de GC subproceso, en milisegundos;
(11) Las líneas 23 y 24 muestran el tiempo dedicado por el subproceso GC a otras tareas, en milisegundos. Puede ver que esta parte del tiempo es muy pequeña; (12) La línea 25 muestra el tiempo
para borrar CardTable. RS se basa en CardTable para registrar qué objetos están vivos;
(13) Muestra el tiempo necesario para varias otras tareas, como el tiempo para seleccionar CSet (Conjuntos de colección), Ref Proc (procesamiento) Referencia débil, tiempo de referencia suave ), Ref Enq (referencia débil, tiempo de puesta en cola de referencia suave) y Free CSet (el tiempo para liberar el área en el CSet reciclado, incluido su RS); (14) Muestra el reciclaje de GC más familiar La situación general aquí muestra que un
Insertar descripción de la imagen aquí
total Se han limpiado 32 MB del área del Edén, no se han liberado objetos en el área de supervivientes y no se ha liberado ningún espacio en todo el espacio del montón. La CPU del usuario tardó 0,16 segundos y el tiempo real tardó 0,04 segundos;
Insertar descripción de la imagen aquí

5.4.7 Parámetros relacionados con G1

1. -XX:+UseG1GC: Encienda el interruptor de G1;
2. -XX:MaxGCPauseMillis: Se utiliza para especificar el tiempo máximo de permanencia del objetivo. Si alguna pausa excede este valor de configuración, G1 intentará ajustar la proporción de la nueva generación con respecto a la generación anterior, ajustar el tamaño del montón, ajustar la edad de promoción, etc., en un intento de lograr el objetivo preestablecido. Para el ajuste del rendimiento, si se acorta el tiempo de pausa, para la nueva generación, esto significa que es probable que aumente la cantidad de GC de nueva generación. Para la generación anterior, para obtener tiempos de pausa más cortos, la cantidad de áreas recolectadas a la vez también se reducirá durante la GC mixta, lo que sin duda aumenta la posibilidad de GC completa; 3.: se utiliza para configurar GC durante la recolección paralela
El -XX:ParallelGCThreadsnúmero de subprocesos de trabajo;
4 -XX:InitiatingHeapOccupancyPercent.: Puede especificar cuándo todo el uso del montón alcanza el nivel para activar la ejecución del ciclo de marca concurrente. El valor predeterminado es 45, es decir, cuando la tasa de ocupación de todo el montón alcanza el 45%, se ejecuta un ciclo de marca concurrente. Una vez que se establece este valor, G1 nunca lo modificará, lo que significa que G1 no intentará cambiar este valor para cumplir con el objetivo de MaxGCPauseMillis. Si este valor se establece en un valor grande, el ciclo concurrente no comenzará durante mucho tiempo y la posibilidad de provocar GC completo también aumentará considerablemente. Por el contrario, un valor de InitiatingHeapOccupanyPercent demasiado pequeño provocará la marca concurrente. El ciclo se ejecutará con mucha frecuencia y una gran cantidad de subprocesos de GC se apoderará de la CPU, lo que reducirá el rendimiento de la aplicación.

Supongo que te gusta

Origin blog.csdn.net/weixin_39651041/article/details/129187739
Recomendado
Clasificación