Java virtual machine-4-recolector de basura

Cuarto, el recolector de basura

1. Algoritmo de recolección de basura

[1] Algoritmo Mark-Sweep (Mark-Sweep)

El recolector de basura primero determina todos los objetos que necesitan ser reciclados, los marca y luego realiza un trabajo de limpieza para reciclar todos los objetos que se acaban de marcar.

Desventajas: una no es eficiente y la otra es la fragmentación de la memoria

[2] Copiar algoritmo (Copiar)

Copie los objetos que aún están vivos después de que el recolector de basura trabaje desde el área de memoria donde se realiza la recolección de basura a otra área de memoria libre

Ventajas: sin fragmentación de la memoria

Desventaja: desperdicio de área de memoria

[3] Algoritmo Mark-Compact

El recolector de basura primero determina todos los objetos que necesitan ser reciclados y los marca, luego mueve los objetos que no necesitan ser reciclados (sin marcar) al extremo libre de la memoria y finalmente realiza las operaciones de recolección de basura

Ventajas: sin fragmentación de la memoria

Desventajas: baja eficiencia

[4] Algoritmo de recopilación generacional (recopilación generacional)

De acuerdo con los diferentes ciclos de vida del objeto, la memoria se divide en varios bloques, generalmente el montón de Java se divide en la generación joven y la generación anterior. De esta forma, se puede adoptar el algoritmo de recogida más adecuado según las características de cada época.

La nueva generación, el ciclo de vida del objeto es corto, es adecuado para utilizar el algoritmo de replicación.

En la vejez, el ciclo de vida de los objetos es largo y no hay espacio extra para asignar garantías, por lo que es conveniente utilizar algoritmos de marca-barrido o marca-organización.

2. recolector de basura Java

【1】 Serie

Colector en serie

Tanto en la nueva generación como en la anterior, solo hay un hilo de recolección para realizar las operaciones de recolección de basura. Cuando el subproceso de recolección realiza la recolección de basura, otros subprocesos de trabajo deben suspenderse hasta que finalice la recolección (STW, Stop The World)

La nueva generación adopta el trabajo de un solo subproceso y el algoritmo de replicación; la generación anterior adopta el trabajo de un solo subproceso y utiliza el algoritmo de marcar y clasificar

【2】 ParNuevo

Colector paralelo de nueva generación

En comparación con SerialGC, su punto de optimización es que la nueva generación utiliza subprocesos de recopilación paralelos para funcionar. El número de subprocesos de recopilación habilitados de forma predeterminada es el mismo que el número de CPU, y el número de -XX:ParallelGCThreadssubprocesos de recopilación en paralelo se puede limitar mediante parámetros

La nueva generación usa subprocesos de recolección paralelos para trabajar y usa un algoritmo de copia; la generación anterior usa un solo subproceso para trabajar y usa un algoritmo de marcar y clasificar.

【3】 Barrido paralelo

Colector paralelo de nueva generación

En comparación con ParNew, su objetivo es reducir el tiempo de STW y lograr un rendimiento controlable (rendimiento)

El rendimiento es la relación entre el tiempo utilizado por la CPU para ejecutar el código de usuario y el tiempo total consumido por la CPU (tiempo para ejecutar el código de usuario + tiempo de GC). Por ejemplo, si la máquina virtual se ejecuta durante 100 minutos y la recolección de basura consume 1 minuto, el rendimiento es (100-1) / 100 * 100% = 99%

El -XX:MaxGCPauseMillis=???tiempo máximo de pausa se puede controlar mediante

Y a través -XX:GCTimeRatio=???de controlar el rendimiento

Además, hay un parámetro -XX:+UseAdaptiveSizePolicy. Después de abrirlo, JVM puede recopilar información de monitoreo de rendimiento de acuerdo con la operación actual del sistema y ajustar dinámicamente, como: -Xmn (tamaño de nueva generación), -XX: SurvivorRatio (proporción de Eden Park y Survivor Area) Y -XX: PretenureSizeThreshold (promovió la edad del objeto de vejez) y otros parámetros

La nueva generación usa subprocesos de recolección paralelos para trabajar y usa un algoritmo de copia; la generación anterior usa un solo subproceso para trabajar y usa un algoritmo de marcar y clasificar.

【4】 Serial Antiguo (PS MarkSweep)

Coleccionista en serie antiguo

Ahora se usa principalmente como un plan de respaldo para el recopilador CMS, es decir, se usa cuando ocurre una falla de modo concurrente

Utiliza solo un hilo de recolección para realizar operaciones de recolección de basura en las generaciones jóvenes y mayores.

El colector de la vieja generación de Parallel Scavenge usa PS MarkSweep, pero su implementación está muy cerca de la implementación de Serial Old, por lo que en muchos materiales oficiales, se explica usando Serial Old en lugar de PS MarkSweep.

La nueva generación adopta el trabajo de un solo subproceso y el algoritmo de replicación; la generación anterior adopta el trabajo de un solo subproceso y utiliza el algoritmo de marcar y clasificar

【5】 Paralelo antiguo

Colector paralelo

La nueva generación usa subprocesos de recolección paralelos para trabajar y usa el algoritmo de replicación; la generación anterior usa subprocesos de recolección paralelos para trabajar y usa el algoritmo de clasificación de marcas

【6】 CMS (Barrido de marca concurrente)

Recopilador de limpieza de marcas concurrente

Es un coleccionista que tiene como objetivo obtener el menor tiempo de STW

La vejez usa hilos de marcado paralelos e hilos de recolección paralelos para trabajar, usando algoritmos de barrido de marcas

Proceso de trabajo:

  1. Marca inicial CMS 【STW】

    Marque los objetos que GC Roots puede asociar directamente

  2. Marca simultánea (marca simultánea de CMS) [Trabajar con hilos de usuario]

    Realizar rastreo de raíces GC

  3. Comentario de CMS 【STW】

    Durante la corrección de marcado simultáneo, el registro de marcado de esa parte del objeto cambia debido al funcionamiento continuo del programa de usuario.

    El tiempo de ejecución de esta etapa es mayor que el tiempo de ejecución de la nota inicial y menor que el tiempo de ejecución de la nota concurrente

  4. Barrido concurrente (barrido concurrente de CMS) [Trabajar con hilos de usuario]

Desventajas:

  1. CMS es muy sensible a los recursos de la CPU. De hecho , los programas diseñados para la concurrencia son muy sensibles a los recursos de la CPU. Aunque en la fase de marcado concurrente, no STW, pero ocupará una parte del hilo (recursos de CPU), lo que hará que el programa se ralentice y reduzca el rendimiento general.

    El número de subprocesos de reciclaje que se inician de forma predeterminada es (número de CPU + 3) / 4. Cuando el número de CPU es superior a 4, los subprocesos de recolección de basura para la recolección de basura paralela no son inferiores al 25%, y cuando el número de CPU es menor que 4, necesita sacar La mitad de la potencia de cálculo se le da al CMS para ejecutar el subproceso de recopilación

  2. CMS no puede limpiar la basura flotante (basura flotante), puede ocurrir una falla del modo concurrente, lo que da como resultado un GC completo

    La basura flotante se refiere a los nuevos objetos basura que aparecen después de la fase de marcado concurrente. Estos objetos solo se pueden recolectar en el siguiente GC.

  3. Como otros coleccionistas, CMS no puede esperar hasta que la vejez esté casi llena antes de recolectar. Necesita reservar una parte del espacio para la ejecución paralela de la operación del programa. Puede utilizar -XX:CMSInitiatingOccupancyFractionpara ajustar el porcentaje de activación. El valor predeterminado de este atributo: JDK5 es 68, JDK6 es 92, JDK7 es -1 (JDK7 tiene otro parámetro CMSInitiatingPermOccupancyFraction, que corresponde al porcentaje de memoria activado por la generación permanente) y JDK8 es -1

    Si el espacio de memoria reservado no puede satisfacer las necesidades del programa, se producirá un Fallo de modo concurrente En este momento, la JVM iniciará el plan de respaldo e iniciará temporalmente Serial Old para realizar la recolección de basura . Pero esto aumentará el tiempo de STW. Entonces, el espacio de memoria reservado no debe ser demasiado pequeño

  4. CMS utiliza un algoritmo de barrido de marcas, que generará fragmentación de la memoria. La fragmentación excesiva de la memoria causará muchos problemas para la asignación de objetos grandes. Aunque hay mucho espacio libre en la generación anterior, el GC completo se activará porque no puede encontrar suficiente espacio de memoria continua.

    Hay un parámetro que se -XX:+UseCMSCompactAtFullCollectionutiliza para controlar la operación de clasificación de la memoria cuando la GC completa. Pero la operación de consolidación de memoria no se puede paralelizar. También hay un parámetro -XX:CMSFullGCsBeforeCompactionque se usa para establecer cuántos GC completos sin organización de memoria se ejecutan, seguidos de un GC completo comprimido, el valor predeterminado es 0, es decir, cada GC completo está comprimido

【7】 G1

Garbage-First, es un recolector de basura para aplicaciones del lado del servidor

G1 divide todo el montón de Java en varias regiones de igual tamaño (Región). La diferencia con el pasado es que aunque conserva los conceptos de Cenozoico y Generación Anciana, Cenozoica y Generación Anciana ya no son físicamente continuos, sino que cada Región contiene parte de la Generación Cenozoica y Anciana.

De forma predeterminada, el montón de Java se divide en aproximadamente 2048 regiones (si el número es demasiado pequeño, afectará la eficiencia de la recopilación y aumentará el tiempo de escaneo). -XX:G1HeapRegionSize=???El tamaño de cada partición se puede ajustar por parámetros , el valor predeterminado es 1 MB (1048576B), el máximo es 32 MB (33554432B) y debe ser una potencia de dos, menos de 1 MB, tomar 1 MB, más de 1 MB, reducir a el poder de 2. valor

G1 también puede planear evitar la recolección de basura en toda la región en todo el montón de Java. Realizará un seguimiento del valor de la acumulación de basura en cada región (la cantidad de memoria que puede liberar el GC y el tiempo de recolección requerido), y mantendrá una en la lista de prioridades de fondo, cada vez de acuerdo con el tiempo de recolección permitido, se da prioridad a la región con el valor más alto (el origen del nombre Garbage-First)

caracteristicas:

  1. Paralelo y concurrencia

    Aproveche al máximo las ventajas de hardware de las CPU multinúcleo para reducir el tiempo de STW y mejorar el rendimiento. Y el hilo de recolección de basura y el hilo de usuario se pueden procesar al mismo tiempo

  2. Colección generacional

    G1 divide lógicamente cada región en Eden, Survivor y Old. Cada región se ajustará y cambiará continuamente a medida que se ejecute el colector G1

  3. Integración espacial

    G1 en su conjunto utiliza un algoritmo de marcar y ordenar, pero desde un punto de vista parcial, se implementa en base a un algoritmo de copia. Esto significa que durante el funcionamiento del recopilador G1, no se producirá ninguna fragmentación de la memoria. No activará el siguiente GC de antemano porque el programa necesita asignar objetos grandes y no puede encontrar espacio de memoria contiguo

  4. Pausa predecible

    El -XX:MaxGCPauseMillistiempo máximo de STW se puede especificar mediante parámetros . Y de acuerdo con la lista de prioridades de reciclaje establecida, dé prioridad al reciclaje de aquellas regiones con alto valor de reciclaje.

Proceso de trabajo:

  1. Marcado inicial 【STW】

    Marque los objetos a los que GC Roots puede asociarse directamente. Menor tiempo de ejecución

  2. Marcado concurrente [Trabajar con hilos de usuario]

    A partir de GC Roots, se realiza el análisis de accesibilidad de los objetos en la memoria del montón para encontrar los objetos supervivientes. Tiempo de ejecución prolongado, pero se puede ejecutar simultáneamente con el programa de usuario.

  3. Marcado final 【STW】

    Corrija el registro de cambios de marca debido a la ejecución concurrente de programas. Se puede ejecutar en paralelo con el programa de usuario.

  4. Detección y reciclaje (conteo de datos en vivo y evacuación)

    Según el tiempo de pausa especificado por el usuario, haga un plan de recolección y ejecute el comando de recolección. Se puede ejecutar en paralelo con el programa de usuario.

Nota: Por ahora, el colector G1 no es estable y no se recomienda usarlo en un sistema de producción.

3. La elección del recolector de basura

[1] Código fuente de JDK

bool Arguments::check_gc_consistency() {
    bool status = true;
    
    uint i = 0;
    if (UseSerialGC)                        i++;
    if (UseConcMarkSweepGC || UseParNewGC)  i++;
    if (UseParallelGC || UseParallelOldGC)  i++;
    if (UseG1GC)                            i++;
    if (i > 1) {
        jio_fprintf(defaultStream::error_stream(),
                   "Conflicting collector combinations in option list; "
                    "please refer to the release notes for the combinations "
                    "allowed\n");
        status = false;
    }

    return status;
}

En el código fuente C ++ del JDK, hay un método para verificar la corrección de la configuración de la política de GC.

【2】 Serial + Serial Antiguo

Usar parámetros-XX:+UseSerialGC

La nueva generación utiliza colectores en serie y la generación anterior también utiliza colectores en serie.

【3】 ParNew + Serial Old

Usar parámetros-XX:+UseParNewGC

La nueva generación utiliza colectores paralelos y la generación anterior utiliza colectores en serie.

Tenga en cuenta que al usar esta configuración de estrategia, la máquina virtual arroja un mensaje de advertencia

Java HotSpot(TM) 64-Bit Server VM warning: Using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release

Se recomienda no utilizar esta configuración de política, es posible que se elimine en versiones futuras.

【4】 ParNew + (CMS + Serial Old)

Usar parámetros-XX:+UseConcMarkSweepGC

La nueva generación utiliza colectores paralelos y la generación anterior utiliza colectores de borrado paralelo (los colectores en serie hacen planes de respaldo)

【5】 Barrido paralelo + Antiguo paralelo

Utilice parámetros -XX:+UseParallelGCo-XX:+UseParallelOldGC

La nueva generación utiliza colectores paralelos, la generación anterior también utiliza colectores paralelos.

Configuración de la política GC predeterminada de JDK8

【6】 G1

Usar parámetros-XX+:UseG1GC

[7] Resumen

Núcleo único: serie

Multi-core, alto rendimiento: Parallel Scavenge y Parallel Old

Respuesta rápida de varios núcleos: ParNew y CMS

4. Asignación de memoria de objetos Java

  1. Se da prioridad a Eden (Eden Park de nueva generación) para su distribución.

  2. El gran objeto entra directamente en la vejez. El llamado objeto grande se refiere a un objeto que requiere una gran cantidad de espacio de memoria continuo, como una cadena muy larga o una gran matriz. -XX:PretenureSizeThreshold=???El umbral del tamaño del objeto se puede ajustar mediante parámetros, el valor predeterminado es 0, es decir, sin límite. Este parámetro no tiene unidad. Tenga en cuenta que este parámetro solo es válido para los colectores Serial y ParNew, y el colector Parallel Scavenge no reconoce este parámetro

  3. Cuando el número de tiempos de supervivencia del objeto alcanza MaxTenuringThreshold, entrará en la vejez

  4. Si el tamaño total de todos los objetos de la misma edad en el área de supervivencia es mayor que la mitad del Superviviente (área de supervivencia), los objetos con una edad mayor o igual a esta edad se copiarán a la generación anterior durante el Minor GC. . Este es el juicio de edad de los objetos dinámicos.

  5. Cuando ocurre Minor GC, si los objetos supervivientes en Eden Park y una determinada área de supervivencia no se pueden copiar a otra área de supervivencia, el mecanismo de garantía de asignación de espacio tomará prestada la memoria de la generación anterior y copiará los objetos a la generación anterior por adelantado.

    Puede pasar XX:+HandlePromotionFailureparámetros para permitir fallos de garantía

    Si se permite el fallo de garantía, comprobará si el máximo de memoria continua disponible en la antigua generación es mayor que el tamaño medio de los objetos promovidos a la antigua generación. Si es mayor, intentará realizar Minor GC, en caso contrario realizará GC completa. La GC menor es arriesgada aquí, porque puede haber grandes objetos supervivientes, lo que lleva a la promoción a la generación anterior, y la generación anterior no tiene suficiente espacio de memoria, lo que conduce a la GC completa.

    Si no se permite el fallo de la garantía, proceda directamente a Full GC

Supongo que te gusta

Origin blog.csdn.net/adsl624153/article/details/103865572
Recomendado
Clasificación