Recopilador y mecanismo de recolección de basura de JVM

1 ¿Cómo determinar que un objeto es basura?

      Para realizar la recolección de basura, primero debe saber qué tipo de objeto es basura

1.1 Método de recuento de referencias

      La lógica del método de recuento de referencias es: cuando un objeto se almacena en el montón, se mantiene un contador en la cabecera del objeto, y si un objeto le añade una referencia, se añade el contador ++. Si falla una relación de referencia, entonces contrarrestar. Si el contador de un objeto se vuelve 0, significa que el objeto ha sido descartado y no está vivo.

      Desventajas: Las "islas" son fáciles de producir, es decir, si AB tiene referencias entre sí, nunca se puede reciclar.

Welfare Welfare Welfare Gratis para recibir el mapa de habilidades del marco de Java Tenga en cuenta que es gratis 

 

Gratis para recibir el + V requerido para recibir

1.2 Análisis de accesibilidad

      A través del objeto de GC Root, comience a mirar hacia abajo para ver si se puede alcanzar un objeto.

      Se puede utilizar como raíz de GC: cargador de clases, subproceso, tabla de variables locales de la pila de máquinas virtuales, miembro estático, referencia constante, variable de la pila de métodos locales, etc.

     Como se muestra en la figura siguiente, utilizando GC Root como nodo, busque hacia abajo.Cuando un objeto no está conectado por la cadena de referencia GC Root, se marcará como un objeto reciclable. Aunque Object5, 6 y 7 tienen referencias entre sí, son inalcanzables para GC Root, por lo que se considerarán objetos reciclables.

2 algoritmo de recolección de basura

     Una vez que se ha determinado que un objeto es basura, lo siguiente que hay que considerar es el reciclaje, entonces, ¿cómo reciclarlo?

2.1 Barrido de marcas

  • marca

      Descubra los objetos en la memoria que deben reciclarse y márquelos

  • Claro

      Limpie los objetos marcados para reciclar y libere el espacio de memoria correspondiente

** Desventajas: **

  1. Tanto los procesos de marcado como los de limpieza requieren mucho tiempo y son ineficientes
  2. Se generará una gran cantidad de fragmentos de memoria no contiguos. Demasiada fragmentación de espacio puede llevar a la necesidad de asignar objetos grandes en el proceso en ejecución del programa, no poder encontrar suficiente memoria continua y tener que activar otra recolección de basura por adelantado

2.2 Copiar

      Divida la memoria en dos áreas iguales y use solo una de ellas a la vez, como se muestra en la siguiente figura:

      Cuando uno de la memoria se agota, los objetos supervivientes se copian en el otro y luego el espacio de memoria utilizado se borra de una vez.

** Desventajas: ** Uso reducido del espacio

2.3 Marca compacta

      El proceso de marcado sigue siendo el mismo que el algoritmo de "marcado-barrido", pero los pasos siguientes no son para limpiar directamente los objetos reciclables, sino para mover todos los objetos supervivientes a un extremo y luego limpiar directamente la memoria fuera del límite final

      Deje que todos los objetos supervivientes se muevan hacia un extremo y limpie los recuerdos inesperados en el límite.

2.4 Algoritmo de recopilación generacional

  • Área joven: algoritmo de replicación (una vez asignado el objeto, el ciclo de vida puede ser relativamente corto y la eficiencia de replicación del área joven es relativamente alta)
  • Área anterior: Marque la limpieza o el marcado (los objetos del área anterior tienen un tiempo de supervivencia más largo, no es necesario copiar, es mejor hacer una marca y luego limpiar)

3 recolector de basura

     Si el algoritmo de recolección es la metodología de recolección de basura, entonces el recolector de basura es su aterrizaje

3.1 Colector en serie

Colector cenozoico, la única opción para la colección cenozoica de las primeras versiones de JDK

Es un recolector de un solo subproceso y otros subprocesos se suspenderán durante la recolección de basura.

Ventajas: simple y eficiente, con alta eficiencia de teléfonos móviles de un solo subproceso

Desventajas: necesidad de suspender otros hilos

Algoritmo: Copiar algoritmo

Rango de uso: nueva generación

Aplicación: el recopilador predeterminado de nueva generación en modo Cliente

3.2 Colector ParNew

La nueva generación de colectores puede entenderse como una versión multiproceso del colector serial

Ventajas: Cuando hay varias CPU, es más eficiente que Serial.

Desventajas: el proceso de recopilación suspende todos los subprocesos de la aplicación, que es menos eficiente que Serial cuando se usa una sola CPU.

Algoritmo: Copiar algoritmo

Ámbito de aplicación: nueva generación

Aplicación: el recopilador de nueva generación preferido en máquinas virtuales que se ejecutan en modo servidor

3.3 Colector de carrocería paralelo

      El recopilador Parallel Scavenge es un recopilador de nueva generación. También es un recopilador que utiliza un algoritmo de replicación. También es un recopilador paralelo de múltiples subprocesos. Tiene el mismo aspecto que ParNew, pero Parallel Scanvenge presta más atención al rendimiento del sistema.

      Rendimiento = tiempo para ejecutar el código de usuario / (tiempo para ejecutar el código de usuario + tiempo de recolección de basura)

      Por ejemplo, la máquina virtual se ejecuta durante 100 minutos en total y el tiempo de recolección de basura es de 1 minuto Rendimiento = (100-1) / 100 = 99%. Si el rendimiento es mayor, significa que el tiempo de recolección de basura es más corto y el código de usuario puede hacer un uso completo de los recursos de la CPU y completar las tareas computacionales del programa lo antes posible.

-XX:MaxGCPauseMillis控制最大的垃圾收集停顿时间,
-XX:GC Time Ratio直接设置吞吐量的大小
复制代码

3.4 Colector antiguo en serie

       El colector Serial Old es la versión antigua del colector Serial, y también es un colector de un solo subproceso. La diferencia es que utiliza el "algoritmo de marca y clasificación". El proceso de operación es el mismo que el del colector Serial.

3.5 Coleccionista antiguo paralelo

      El recopilador Parallel Old es la versión anterior del recopilador Parallel Scavenge, que utiliza varios subprocesos y un "algoritmo de marcado y clasificación" para la recolección de basura. El rendimiento es la prioridad.

3.6 colector CMS

       El recopilador CMS (Concurrent Mark Sweep) es un recopilador que tiene como objetivo obtener el tiempo de pausa de recuperación más corto.

       Se utiliza el "algoritmo de eliminación de marcas" y todo el proceso se divide en 4 pasos

  1. Marca inicial Marca inicial de CMS Marque los objetos con los que GC Roots puede asociarse Stop The World ---> rápido
  2. Marcar simultáneamente la marca CMS concurrente para GC Roots Tracing
  3. Observación Observación de CMS Modificar el contenido del marcado simultáneo debido a cambios en el programa de usuario Detener el mundo
  4. Barrido concurrente de CMS

      Debido al marcado simultáneo y la eliminación simultánea en todo el proceso, el subproceso del recopilador puede trabajar con el subproceso del usuario, por lo que, en general, el proceso de recuperación de memoria del recopilador de CMS se ejecuta al mismo tiempo que el subproceso del usuario.

Ventajas: recopilación simultánea, pausa baja

Desventajas: el uso del algoritmo de barrido de marcas generará muchos fragmentos de espacio y la fase concurrente reducirá el rendimiento

Colector 3.7 G1

      Paralelo y concurrencia

      Colección generacional (aún conserva el concepto de generaciones)

      Integración espacial (en su conjunto, pertenece al algoritmo de "organización de marcado" y no causará fragmentación espacial)

      Pausas predecibles (más avanzado que CMS es que los usuarios pueden especificar claramente un segmento de tiempo de M milisegundos de duración, y el tiempo dedicado a la recolección de basura no debe exceder los N milisegundos)

      Cuando se utiliza el recopilador G1, el diseño de memoria del montón de Java es muy diferente al de otros recopiladores. Divide todo el montón de Java en varias regiones independientes de igual tamaño (Región), aunque la nueva generación y la generación anterior todavía se conservan Concepto, pero la nueva generación y la vieja generación ya no están físicamente separadas, son todas una colección de regiones (no necesariamente continuas).

Proceso de trabajo (similar a CMS):

  1. Marcado inicial Marque los objetos que GC Roots puede asociar y modifique el valor de TAMS, debe suspender el hilo del usuario
  2. Marcado simultáneo Realice un análisis de accesibilidad desde GC Roots, descubra los objetos supervivientes y ejecútelo al mismo tiempo que los subprocesos de usuario
  3. Marcado final (Marcado final) Modifique la fase de marcado concurrente debido a la ejecución concurrente del programa de usuario para cambiar los datos, el hilo del usuario debe suspenderse
  4. Detección y reciclaje (recuento y evacuación de datos en vivo) Clasifique el valor y el costo de reciclaje de cada región y formule un plan de reciclaje de acuerdo con el tiempo de pausa del GC esperado por el usuario.

3.8 Clasificación

  • Colector de serie-> Serie y serie antigua

Solo se puede ejecutar un subproceso de recolección de basura y el subproceso del usuario se suspende. Adecuado para dispositivos integrados con memoria relativamente pequeña.

  • Colector paralelo [prioridad de rendimiento] -> Parallel Scanvenge, Parallel Old

Varios subprocesos de recolección de basura funcionan en paralelo, pero el subproceso del usuario todavía está esperando. Es adecuado para escenarios de interacción débil como la computación científica y el procesamiento en segundo plano.

  • Colector concurrente [prioridad de tiempo de pausa] -> CMS, G1

El hilo del usuario y el hilo de recolección de basura se ejecutan al mismo tiempo (pero no necesariamente en paralelo, y pueden ejecutarse alternativamente), y el hilo de recolección de basura no suspenderá la operación del hilo del usuario durante la ejecución. Es adecuado para escenarios que requieren un tiempo relativo, como la Web.

3.9 Cómo elegir un recolector de basura adecuado

Página web oficial

[https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html#sthref28](https://docs.oracle.com/javase/8/docs/technotes/ guides / vm / gctuning / collectors.html # sthref28)

  • Priorice el ajuste del tamaño del montón y deje que el servidor elija por sí mismo
  • Si la memoria es inferior a 100 M, utilice el colector en serie
  • Si es un solo núcleo y no hay un requisito de tiempo de pausa, use serial o JVM para elegir
  • Si el tiempo de pausa es más de 1 segundo, elija paralelo o JVM
  • Si el tiempo de respuesta es el más importante y no puede exceder 1 segundo, use un recolector concurrente

** Método de apertura: **

(1) Serie

-XX : + UseSerialGC

-XX: + UseSerialOldGC

(2) Paralelo (prioridad de rendimiento):

-XX: + UseParallelGC

-XX : + UseParallelOldGC

(3) Colector concurrente (prioridad de tiempo de respuesta)

-XX : + UseConcMarkSweepGC

-XX: + UseG1GC

 

Supongo que te gusta

Origin blog.csdn.net/yuandengta/article/details/109188592
Recomendado
Clasificación