[Conocimiento profundo de JVM] 10, CMS + G1 + MixedGC + tabla de tarjetas + etiquetas faltantes y evitar etiquetas faltantes [borrador]

 

G1

  1. https://www.oracle.com/technical-resources/articles/java/g1gc.html

Detalles del registro G1

[GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0015790 secs]
//young -> 年轻代 Evacuation-> 复制存活对象 
//initial-mark 混合回收的阶段,这里是YGC混合老年代回收
   [Parallel Time: 1.5 ms, GC Workers: 1] //一个GC线程
      [GC Worker Start (ms):  92635.7]
      [Ext Root Scanning (ms):  1.1]
      [Update RS (ms):  0.0]
         [Processed Buffers:  1]
      [Scan RS (ms):  0.0]
      [Code Root Scanning (ms):  0.0]
      [Object Copy (ms):  0.1]
      [Termination (ms):  0.0]
         [Termination Attempts:  1]
      [GC Worker Other (ms):  0.0]
      [GC Worker Total (ms):  1.2]
      [GC Worker End (ms):  92636.9]
   [Code Root Fixup: 0.0 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.0 ms]
   [Other: 0.1 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 0.0 ms]
      [Ref Enq: 0.0 ms]
      [Redirty Cards: 0.0 ms]
      [Humongous Register: 0.0 ms]
      [Humongous Reclaim: 0.0 ms]
      [Free CSet: 0.0 ms]
   [Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)]
 [Times: user=0.00 sys=0.00, real=0.00 secs] 
//以下是混合回收其他阶段
[GC concurrent-root-region-scan-start]
[GC concurrent-root-region-scan-end, 0.0000078 secs]
[GC concurrent-mark-start]
//无法evacuation,进行FGC
[Full GC (Allocation Failure)  18M->18M(20M), 0.0719656 secs]
   [Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)], [Metaspace: 38
76K->3876K(1056768K)] [Times: user=0.07 sys=0.00, real=0.07 secs]

 El rendimiento se reduce entre un 10% y un 15%, pero su tiempo de respuesta puede alcanzar los 200 ms o menos.

 

 Estratificación y divide y vencerás.

Humongous: agranda el área del objeto.

viejo:

Sobreviviente:

Edén:

 

Características del G1:

  • Colección concurrente
  • La compresión del espacio libre no prolonga el tiempo de pausa de GC
  • Tiempo de pausa de GC más predecible
  • Utilice escenarios que no requieran un alto rendimiento por adelantado y requieran un tiempo de respuesta elevado.

concepto basico:

card table : Card Table Dado que YGC necesita escanear toda el área antigua, la eficiencia es muy baja, por lo que JVM diseñó CardTable. Si un objeto en un área VIEJA CardTable apunta al área Y, configúrelo en Dirty . , Solo es necesario escanear la tarjeta sucia. En términos de estructura, la tabla de tarjetas es implementada por BitMap

Al juzgar si el objeto de nueva generación está vivo (la referencia ha llegado a la generación anterior): ¿Es necesario atravesar la generación anterior (esto es demasiado eficiente)?

Tabla de mapa de bits

CardTbale

JVM GC se puede dividir en MinorGC, MajorGC y FullGC . Para Mirnor GC, su tiempo se determina principalmente por dos factores:

  1. Es hora de copiar objetos activos
  2. Es hora de escanear la mesa de cartas (el objeto de la vieja generación se refiere al objeto de la nueva generación)

La máquina virtual Java usa una estructura de datos llamada CardTable (tabla de tarjetas) para marcar si un objeto en un área de memoria determinada en la generación anterior tiene una referencia a un objeto de nueva generación. El número de tablas de tarjetas depende del tamaño de la generación anterior. y cada tarjeta. De acuerdo con el tamaño de la memoria, cada tarjeta corresponde a un bit en la tabla de tarjetas. Cuando un objeto de la generación anterior tiene una referencia al objeto de la nueva generación, la JVM marca la ubicación de la tarjeta correspondiente a este objeto como sucio (El bit de bit se establece en 1), por lo que no es necesario escanear toda la generación anterior durante la GC menor, sino escanear el área de memoria correspondiente a Tarjeta sucia.

 

Conjunto de colección : las cartas marcadas se cuentan como Conjunto de colección.

RSet = RememeberedSet:

  • Registre las referencias de objetos en otras regiones a esta región.
  • El límite de Rset es que el recolector de basura no necesita escanear todo el montón para encontrar quién ha hecho referencia a los objetos en la partición actual, solo escanea el RSet.

Relación de nuevo a antiguo: dinámico

  • 5% -60%
  • Generalmente no es necesario especificarlo manualmente
  • Tampoco lo especifique manualmente, porque este es el punto de referencia para que G1 prediga el tiempo de pausa.
  • El rendimiento se reduce entre un 10% y un 15%, pero su tiempo de respuesta puede alcanzar los 200 ms.

Cuándo se activa GC (tenga en cuenta que G1 seguirá siendo FGC, cuando la asignación de objetos es particularmente rápida)

  • YGC
    • No hay suficiente espacio en el Edén
    • Ejecución paralela multiproceso
  • FGC
    • Espacio insuficiente en Old
    • System.gc ()

MixedGC en G1

  • Equivalente a un CMS
  • XX : IniciatingHeapOccupacyPercent
    • El valor predeterminado es más del 45% (se puede especificar, ocupando espacio en la memoria del montón)
    • Cuando O excede este valor, inicie MixedGC

El proceso de MixedGC

  • Marca inicial STW
  • Marca concurrente
  • Calificación final STW (re-calificación)
  • Cribado y reciclaje STW (paralelo)

Marca de tres colores:

  • Blanco: objetos sin marcar
  • Gris: self está marcado, las variables miembro no están marcadas
  • Negro: tanto las variables propias como las miembros (objetos referenciados) se han marcado como completas

Criterios faltantes: (ambos se cumplen) Romper uno es destruir

  • En el proceso de remarcado, el negro apunta al blanco. Si el negro no se vuelve a escanear, la etiqueta se perderá y el objeto D blanco se tratará como si no hubiera una nueva referencia al mismo y se reciclará.
  • En el proceso de marcado simultáneo, Mutator elimina todas las referencias de gris a blanco, lo que resultará en etiquetas perdidas, y la exclusiva blanca debe reciclarse en este momento.

Simplemente rompa una de las dos condiciones anteriores:

  • actualización incremental: actualización incremental, preste atención al aumento de referencias, vuelva a marcar de negro a gris y vuelva a escanear los atributos la próxima vez ( utilizado por CMS )
  • Instantánea de SATB al principio: enfoque en la eliminación de referencias Cuando B -> D desaparece, empuje esta referencia a la pila de GC para asegurarse de que D aún pueda ser escaneada por GC. ( Usado por G1 )

¿Por qué G1 usa SATB?

  • Si se usa el primer tipo, las referencias negras se escanearán nuevamente, lo cual es muy ineficiente
  • Gris: "Cuando la referencia blanca desaparece, si no hay negro apuntando a la referencia blanca, se empujará a la pila (cuando escanee el hilo la próxima vez, escanearé la pila que ha cambiado y solo escanearé el referencia a qué objeto blanco), obtengo esta aplicación en el siguiente escaneo. Debido a la existencia de RememeberedSet, no es necesario escanear todo el montón para encontrar referencias blancas. La eficiencia es relativamente alta. SATB funciona con RSet, que es natural. (Tenga en cuenta que la actualización incremental no puede cooperar con RSet; de lo contrario, aún tendrá que atravesarla nuevamente) Existe una diferencia entre las barreras de escritura en GC y las barreras de escritura en memoria

RSet y la eficiencia de la asignación

  • Debido a la existencia de RSet, cada vez que asigna una referencia a un objeto, debe realizar algunas operaciones adicionales
  • Se refiere a hacer algunos registros adicionales en RSet (llamado barrera de escritura en GC)
  • Esta barrera de escritura no es igual a una barrera de memoria.
  • Sin bala de plata

 

Puntero de color: (64 bits)

 

 

 

 

 

 

 

operación

  1. -XX: ¿Qué controla MaxTenuringThreshold? A: La edad a la que el sujeto ingresó a la vejez B: El porcentaje de memoria basura cuando la FGC se desencadenó en la vejez

  2. En el entorno de producción, tiendo a establecer la memoria de pila máxima y la memoria de pila mínima como: (¿Por qué?) A: Igual B: Diferente

  3. El recolector de basura predeterminado de JDK1.8 es: A: ParNew + CMS B: G1 C: PS + ParallelOld D: ninguno de los anteriores

  4. ¿Qué es la prioridad del tiempo de respuesta?

  5. ¿Qué es la prioridad de rendimiento?

  6. ¿Cuál es la diferencia entre ParNew y PS?

  7. ¿Cuál es la diferencia entre ParNew y ParallelOld? (Diferentes edades, diferentes algoritmos)

  8. Para escenarios informáticos a largo plazo, debe elegir: A: tiempo de pausa B: rendimiento

  9. Los sitios web de comercio electrónico a gran escala deben elegir: A: tiempo de pausa B: rendimiento

  10. ¿Cuáles son los recolectores de basura HotSpot más utilizados?

  11. ¿Cuáles son las combinaciones comunes de recolectores de basura HotSpot?

  12. ¿Cuál es el recolector de basura predeterminado de JDK1.7 1.8 1.9? ¿Como revisar?

  13. La llamada afinación, ¿qué es exactamente afinación?

  14. Si se usa la combinación PS + ParrallelOld, ¿qué se puede hacer para que el sistema básicamente no produzca FGC?

  15. Si se usa la combinación ParNew + CMS, ¿qué se puede hacer para que el sistema básicamente no produzca FGC?

    1. Aumente la memoria JVM

    2. Aumentar la proporción de jóvenes

    3. Eleva la edad de YO

    4. Incrementar la proporción de área S

    5. Evite pérdidas de memoria de código

  16. ¿G1 es generacional? ¿El recolector de basura G1 generará FGC?

  17. Si G1 produce FGC, ¿qué debe hacer?

    1. Expandir memoria
    2. Mejore el rendimiento de la CPU (recolección más rápida, velocidad fija de la lógica empresarial que genera objetos, recolección de basura más rápida, mayor espacio de memoria)
    3. Disminuya el umbral de activación de MixedGC para que MixedGC suceda antes (el valor predeterminado es 45%)
  18. P: ¿Puedo volcar casualmente en el entorno de producción? Los montones pequeños tienen poco impacto, los montones grandes tendrán pausas de servicio o se congelarán (agregar en vivo puede aliviarlos) y habrá FGC antes del vaciado

  19. P: ¿Cuáles son los problemas comunes de OOM? Stack heap MethodArea memoria directa

Parámetros de uso común de GC

  • -Xmn -Xms -Xmx -Xss espacio de pila máximo de pila mínima de generación joven
  • -XX: + UseTLAB use TLAB, abierto por defecto
  • -XX: + PrintTLAB Imprime el uso de TLAB
  • -XX: TLABSize establece el tamaño de TLAB
  • -XX: + DisableExplictGC System.gc () no funciona, FGC
  • -XX: + ImprimirGC
  • -XX: + PrintGCDetails
  • -XX: + PrintHeapAtGC
  • -XX: + PrintGCTimeStamps
  • -XX: + PrintGCApplicationConcurrentTime (bajo) tiempo de aplicación de impresión
  • -XX: + PrintGCApplicationStoppedTime (bajo) tiempo de pausa de impresión
  • -XX: + PrintReferenceGC (baja importancia) registra cuántas referencias de diferentes tipos de referencia se han recuperado
  • -verbose: proceso detallado de carga de clases de clase
  • -XX: + PrintVMOptions
  • -XX: + PrintFlagsFinal -XX: + PrintFlagsInitial debe usarse
  • -Xloggc: opt / log / gc.log
  • -XX: edad de actualización MaxTenuringThreshold, el valor máximo es 15
  • Número de giros de bloqueo-XX: Parámetro de detección de código de hotspot de PreBlockSpin-XX: Reemplazo escalar del análisis de escape de CompileThreshold ... No se recomienda configurar estos

Parámetros comunes paralelos

  • -XX: SurvivorRatio
  • -XX: PreTenureSizeThreshold ¿Qué tamaño tiene el objeto grande?
  • -XX: MaxTenuringThreshold
  • -XX: + ParallelGCThreads Número de hilo del colector paralelo, también aplicable a CMS, generalmente configurado para ser el mismo que el número de núcleos de CPU
  • -XX: + UseAdaptiveSizePolicy selecciona automáticamente la proporción de tamaño de cada área

Parámetros comunes de CMS

  • -XX: + UseConcMarkSweepGC
  • -XX: Número de hilo de ParallelCMSThreads CMS
  • -XX: CMSInitiatingOccupancyFraction Qué porcentaje de la generación anterior se debe usar antes de comenzar la recopilación de CMS, el valor predeterminado es 68% (valor aproximado), si el retraso de SerialOld ocurre con frecuencia, debe reducirse (recuperación frecuente de CMS)
  • -XX: + UseCMSCompactAtFullCollection para comprimir en FGC
  • -XX: CMSFullGCsBeforeCompaction ¿Cuántas veces realiza FGC la compresión?
  • -XX: + CMSClassUnloadingEnabled
  • -XX: CMSInitiatingPermOccupancyFraction Recuperación de la permanente al alcanzar qué proporción
  • GCTimeRatio Establece el porcentaje de tiempo de GC que ocupa el tiempo de ejecución del programa.
  • -XX: Tiempo de pausa MaxGCPauseMillis, es un tiempo sugerido, GC intentará lograr este tiempo por varios medios, como la reducción de la generación joven

Parámetros comunes de G1

  • -XX: + UseG1GC
  • -XX: MaxGCPauseMillis valor recomendado, G1 intentará ajustar el número de bloques en el área de Young para alcanzar este valor
  • -XX: objetivo del intervalo de pausa de GCPauseIntervalMillisGC
  • -XX: + G1HeapRegionSize tamaño de partición, se recomienda aumentar el valor gradualmente, 1 2 4 8 16 32. A medida que aumenta el tamaño, el tiempo de supervivencia de la basura es más largo y el intervalo de GC es más largo, pero el tiempo de cada GC será más largo. ZGC ha realizado mejoras (tamaño de bloque dinámico)
  • G1NewSizePercent La proporción mínima de la nueva generación, el valor predeterminado es 5%
  • G1MaxNewSizePercent La proporción máxima de la nueva generación, el valor predeterminado es 60%
  • Relación de tiempo recomendado de GCTimeRatio GC, G1 ajustará el espacio de pila de acuerdo con este valor
  • ConcGCThreads número de subprocesos
  • InitiatingHeapOccupancyPercent Índice de ocupación de espacio de almacenamiento dinámico G1

 

Supongo que te gusta

Origin blog.csdn.net/zw764987243/article/details/109590593
Recomendado
Clasificación