JVM señala "Cuatro" siete recolectores de basura comunes

Recolector de basura

1. Serie (nueva generación)

1. Subproceso único (todos los otros subprocesos deben suspenderse durante la recopilación)

2. El recopilador predeterminado en modo cliente también es una buena opción

Ventajas:

1. Simple y eficiente (en comparación con el hilo único de otros coleccionistas)

2. Cuando los recursos de memoria son limitados, el consumo de memoria adicional es mínimo

3. Debido a que no hay sobrecarga de interacción de subprocesos, se puede obtener la mayor eficiencia de subprocesos

Inserte la descripción de la imagen aquí

2. ParNew (nueva generación)

Es una versión multiproceso de Serial.

Colección paralela multiproceso, el resto es lo mismo que Serie

  1. Colección paralela multiproceso (el proceso del usuario debe esperar)

  2. Actualmente único que puede trabajar con el colector CMS trabajo

    Use los -XX:+UseConcMarkSweepGCparámetros, use la combinación de colector ParNew + CMS + Serial Old , en este momento ParNew es el colector predeterminado de la nueva generación

  3. El número de subprocesos de recopilación habilitados de forma predeterminada es el mismo que el número de núcleos de procesador.

    Puede usar -XX:ParallelGCThreadsparámetros para limitar la cantidad de hilos

El uso eficiente de los recursos del sistema durante la recolección de basura es muy beneficioso.

Inserte la descripción de la imagen aquí

Combinaciones canceladas después de JDK9 :

  1. ParNew + CMS (no cancelado, pero no recomendado como combinación de recopilador en modo servidor)
  2. ParNew + Serial Old
  3. Serie + CMS

Por lo tanto, solo ParNew y CMS se pueden combinar, también se puede entender que ParNew se incorpora a CMS

3. Scanvenge paralelo (nueva generación)

1. Replicación basada en marcas

2. Colección paralela

3. Centrarse en el rendimiento Uso Hogar Generación Patio Hora Entre / / ( + ) Tiempo de código de usuario / (tiempo de código de usuario + tiempo de recolección de basura)

Adecuado para tareas en segundo plano sin demasiada interacción.

Parámetros relacionados

  1. -XX: MaxGCPauseMillis

    Número de milisegundos mayor que 0

    Tiempo máximo de pausa de recolección de basura (a expensas del tamaño de la generación joven, cada tiempo de pausa es corto, pero hace que el GC sea más frecuente y reduce el rendimiento)

  2. -XX: GCTimeRatio

    0-100 Entero: la relación entre el tiempo de recolección de basura y el tiempo total. El concepto original del libro es un poco desordenado y no es fácil de entender.

    Pero siempre que el valor del parámetro N se calcule mediante la fórmula: 1/1 + N , se calcula la relación entre el tiempo de recolección de basura y el tiempo total, y N en sí no es la relación

    Si el parámetro es 49: Rendimiento = 1-1 / (1 + 49) = 1-1 / 50 = 98% 1/50 es la proporción del tiempo de recolección de basura

  3. -XX: UseAdaptiveSizePolicy

    Active este parámetro, no necesita especificar el nuevo tamaño de generación (-Xmn), -XX: SurvivorRatio, -XX: PretenureSizeThreshold y otros parámetros, solo necesita especificar un objetivo de optimización: como el montón máximo -Xmx, y los parámetros anteriores 1 o 2, especifique el foco El tiempo de pausa o el rendimiento, el sistema ajustará dinámicamente los parámetros relevantes, esto se llama la estrategia de ajuste adaptativo de la recolección de basura

4. Paralelo viejo

Versión de generación anterior de Scavenge paralelo

  1. Colección concurrente multiproceso
  2. Clasificación basada en marcas
  3. Centrarse en el rendimiento (Paralelo Scanvenge + Paralelo antiguo)

Inserte la descripción de la imagen aquí

5. Serie antigua

Versión de la generación anterior de serie

1. hilo único

2. Marcado

3. Igual que Serial para modo cliente

4. Como plan de respaldo cuando falla el recopilador de CMS

Diagrama de proceso de trabajo referencia uno, colector en serie

6. CMS (Vejez)

Preste atención al tiempo de pausa -> Ofrezca a los usuarios una buena experiencia interactiva en modo servidor como B / S

Proceso de operación

1. Marca inicial

2. Marca concurrente

3. Observación

4. Barrido concurrente (barrido concurrente)

1. Marcado inicial: marcado de objetos directamente asociados con GCRoots, rápido

2. Marcado concurrente: comience a recorrer todo el gráfico de objetos de los objetos directamente asociados con GCRoots, sin suspender hilos de usuario, y ejecutar simultáneamente con hilos GC, lo que lleva mucho tiempo

3. Remarcado: corrige el objeto cuya marca cambia debido al hilo del usuario durante el marcado concurrente

4. Eliminación simultánea: elimina los objetos marcados como muertos y puede ejecutarse simultáneamente con el programa de usuario

Inserte la descripción de la imagen aquí

Desventajas

  1. Sensible a los recursos de la CPU

    El número de subprocesos de reciclaje iniciados por el CMS de forma predeterminada es ** (número de CPU +3) / 4 **. Por lo tanto, cuanto menor sea el número de CPU, menor será la velocidad de ejecución de los programas de usuario.

  2. Incapaz de manejar basura flotante

    Debido a que el programa de usuario aún debe ejecutarse en las dos etapas concurrentes, se generarán nuevos objetos basura, y estos objetos solo se pueden recolectar en el próximo GC porque aparecen después de la marca. Estos son basura flotante.

    • El CMS no puede esperar hasta que los objetos de la generación anterior estén llenos.

    • Parámetros -XX:CMSInitiatingOccupancyFraction: establezca el umbral activado por CMS. En jdk1.6, el umbral predeterminado de CMS se eleva al 92%.

    • -XX: + UseCMSInitiatingOccupancyOnly : el valor predeterminado es falso. Si no se usa, el umbral establecido anteriormente se usará solo una vez, y se ajustará automáticamente más tarde; si se usa, el umbral establecido siempre se usará.

    Puede usar estos dos parámetros juntos:

    -XX:CMSInitiatingOccupancyFraction=70 -XX:UseCMSInitiatingOccupancyOnly=true

    • Cuando la memoria reservada durante la operación del CMS no puede satisfacer las necesidades del programa, aparecerá "Falla de modo concurrente", y luego el colector de serie antiguo se habilitará temporalmente para la recolección de basura de la generación anterior, por lo que el tiempo de pausa es muy largo, por lo que el valor del parámetro también se establece Alto es fácil de causar una gran cantidad de "Falla de modo concurrente".

    Cabe señalar que:

    intx CMSInitiatingOccupancyFraction = -1 {product}

    El valor predeterminado de este parámetro es -1 en jdk1.8, y el 92% se calcula de la siguiente manera:

        void ConcurrentMarkSweepGeneration::init_initiating_occupancy(intx io, uintx tr) {
          assert(io <= 100 && tr <= 100, "Check the arguments");
          if (io >= 0) {
            _initiating_occupancy = (double)io / 100.0;
          } else {
            _initiating_occupancy = ((100 - MinHeapFreeRatio) +
                                     (double)(tr * MinHeapFreeRatio) / 100.0)
                                    / 100.0;
          }
        }
    
    
    1. Si el valor del parámetro es mayor o igual a 0, el porcentaje se usa como parámetro

    2. Si menos de 0, de acuerdo con MinHeapFreeRatioy trcalculado según la fórmula anterior, MinHeapFreeRatiose reducirá el montón (no válido -Xms = -Xmx) para el tamaño del montón de lograr este porcentaje, es decir TR CMSTriggerRatio, el valor predeterminado se encuentra para ver estos dos parámetros:

      uintx MinHeapFreeRatio             = 40                           {manageable}
      uintx CMSTriggerRatio               = 80                           {product}
      

      Por lo tanto, el porcentaje de CMS activado es: ((100-40) + (80 * 40) / 100) /100=0.92=92%

  3. Los desechos espaciales existen porque se basan en un algoritmo de marcado y barrido

    • -XX: + UseCMSCompactAtFullCollection : la desfragmentación en FullGC, exclusiva no puede ser concurrente, hará que el tiempo de pausa sea más largo, JDK9 comenzó a abandonarse
    • -XX: + CMSFullGCsBeforeCompaction configurado para desfragmentar después de algunos FullGC

Resumen

El umbral de activación de CMS no puede ser demasiado grande, de lo contrario provocará un fallo de concurrencia, y puede que no sea demasiado pequeño, lo que provocará frecuentes activadores de CMS, y la marca inicial y el remarcado (que requieren mucho tiempo) de CMS provocarán Stop The World. Aumente el tiempo de pausa, que puede configurarse en 70

七 、 Basura primero (G1)

1. Orientación servidor (JDK9 empezar como el recolector de basura por defecto en modo servidor, CMS eran Desaprobar)

2. Para que cualquier parte de la memoria de almacenamiento dinámico forme una colección (CSet), el estándar de medición se convierte en qué pieza de memoria tiene la mayor cantidad de basura almacenada y los ingresos máximos de recuperación

  • G1 divide el montón en regiones independientes de igual tamaño (Región). Cada región puede jugar eden, sobreviviente y la generación anterior. El recolector puede tomar diferentes regiones estratégicas para regiones con diferentes roles. La región es la unidad más pequeña de recuperación individual Es decir, cada vez que el espacio de memoria recuperado es un múltiplo entero de la región

  • La región Humongous (considerada como la generación anterior) en la Región se usa para almacenar objetos grandes , siempre que un objeto con más de la mitad de la capacidad de una región pueda llamarse un objeto grande

    Los parámetros de -XX:G1HeapRegionSizeparámetros pueden especificar el tamaño de cada región, rango: 1M~32Mpotencia de 2 veces

    Los objetos de gran tamaño en toda la región se colocan en forma homogénea consecutiva

  • G1 mantiene una lista de prioridades de acuerdo con el valor de la basura en cada región (es decir, el valor de la experiencia del espacio obtenido y el tiempo requerido para el reciclaje), y preferentemente recicla las regiones con gran valor de acuerdo con el tiempo de pausa establecido por el usuario

Algunas preguntas

  1. G1 usa conjuntos de memoria para evitar escaneos completos de la pila

  2. La fase de marcado concurrente asegura que el hilo de recopilación y el hilo de usuario no interfieran entre sí:

    G1 utiliza el método de instantánea original para garantizar que cuando el hilo del usuario cambie la relación de referencia, la estructura del gráfico del objeto original no se destruya, asegurando la corrección de la marca. Consulte 4.6 arriba (instantánea original)

    • G1 diseñó dos punteros TAMS (Top At Mark Start) para cada región
    • Espacio de partición para la asignación de nuevos objetos generados durante la recopilación concurrente
    • La nueva dirección del objeto debe estar por encima de dos posiciones de puntero
    • Los objetos G1 sobre esta dirección están vivos por defecto
    • Cuando la velocidad de asignación de objetos excede la velocidad de recuperación, el hilo del usuario se congela y se genera un GC completo

Proceso de ejecución

  1. Marca inicial

    Marque los objetos directamente relacionados con GCRoots, modifique el valor del puntero TAMS, de modo que cuando el proceso del usuario se ejecute simultáneamente en la siguiente etapa, se puedan asignar nuevos objetos en las regiones disponibles. Como antes, se requiere STW, pero lleva poco tiempo y se completa sincrónicamente con la ayuda de MinorGC, por lo que G1 no requiere pausas adicionales en esta etapa.

  2. Marca concurrente

    A partir de los objetos directamente relacionados con GCRoots, el análisis de accesibilidad del gráfico de objetos se realiza para descubrir los objetos que se recuperarán, lo que lleva mucho tiempo.

    Se puede ejecutar simultáneamente con el proceso del usuario. Una vez que se completa el escaneo, es necesario volver a procesar los objetos modificados referenciados concurrentes grabados por SATB (instantánea original).

  3. Nota final

    Otra breve pausa en el hilo del usuario se usa para procesar una pequeña cantidad de registros SATB que quedan después de que finaliza la fase de concurrencia.

  4. Cribado y reciclaje

    • Actualizar estadísticas de la región
    • Ordenar todas las regiones por valor de reciclaje y costo
    • Haga un plan de reciclaje de acuerdo con el tiempo de pausa establecido por el usuario
    • Seleccione libremente varias regiones como colección posterior, copie los objetos supervivientes de la región determinada en otra región vacía y luego limpie toda la región antigua
    • El proceso del usuario debe suspenderse , y se pueden ejecutar múltiples recopiladores en paralelo.

    Actualizar-> Ordenar-> Desarrollar plan de reciclaje-> Seleccionar colección posterior-> Copia de limpieza (Paralelo, STW)

    Además del marcado concurrente, todos los procesos del usuario deben detenerse.

El diagrama esquemático es el siguiente:
Inserte la descripción de la imagen aquí

Características y ventajas:

  1. Obtenga el mayor rendimiento posible con un retraso controlado.

  2. El usuario puede especificar el tiempo de pausa esperado (para cumplir con el real)

    El valor predeterminado es 200 ms, que no puede ser demasiado bajo. Demasiado bajo hará que cada colección seleccionada ocupe solo una pequeña parte del montón, y la velocidad de recuperación no puede mantenerse al día con la velocidad de asignación, lo que resulta en un GC completo

  3. Memoria de almacenamiento dinámico de gestión de partición (región)

  4. Determinar el retorno a la recolección de acuerdo con la eficiencia del reciclaje

  5. El todo se basa en la organización de marcas, y el parcial se basa en la copia de marcas, sin fragmentación.

Desventajas (en comparación con CMS)

  1. Uso de la memoria

    Debido a que cada región necesita mantener una tabla de tarjetas para resolver el problema de referencia de generación cruzada, el conjunto de memoria puede representar más del 20% del montón completo. CMS tiene solo un formulario de tarjeta.

  2. Alta carga de ejecución adicional

    Al igual que con CMS, las barreras de escritura se utilizan para mantener la tabla de tarjetas.

    Además de usar la barrera posterior a la escritura como CMS (usando la sincronización directamente), G1 también requiere la barrera previa a la escritura para implementar el algoritmo de instantánea original, lo que crea una carga adicional. (Usar la cola de mensajes)

La aplicación de memoria pequeña CMS tiene una alta probabilidad debido a G1

================================================== ====================

Otras notas relacionadas:

JVM observa (1) área de memoria java y desbordamiento de memoria y creación, diseño y posicionamiento de objetos

Notas de JVM (2) La vida y muerte de los objetos y las cuatro principales referencias a Java

JVM observa (3) el algoritmo de recolección de basura y la implementación del algoritmo HotSpot (punto de seguridad, conjunto de memoria y tabla de tarjetas, barrera de escritura, marca de tres colores, etc.)

JVM observa (cinco) mecanismo de carga de clases, cargador de clases y mecanismo de delegación principal

================================================== ==============

Referencia:
"Comprensión profunda de la tercera edición de la máquina virtual de Java"

Publicado 75 artículos originales · alabanza ganado 13 · vistas 8369

Supongo que te gusta

Origin blog.csdn.net/weixin_43696529/article/details/104884777
Recomendado
Clasificación