Recolección de Basura de Generación Joven y Generación Vieja

algoritmo de copia


Para obtener más contenido del blog, visite solo me encanta comer fruta del dragón , haga clic para obtener más información.


  • descripción general

El algoritmo de copia divide la memoria en dos intervalos En cualquier momento, todos los objetos asignados dinámicamente solo se pueden asignar en uno de los intervalos (llamado intervalo activo), mientras que el otro intervalo (llamado intervalo libre) está libre.
Cuando se agota el espacio de memoria efectivo, la JVM suspenderá la ejecución del programa e iniciará el subproceso GC del algoritmo de copia. A continuación, el subproceso GC copiará todos los objetos sobrevivientes en el área activa al área libre y los organizará estrictamente de acuerdo con las direcciones de memoria. Al mismo tiempo, el subproceso GC actualizará la dirección de referencia de memoria de los objetos sobrevivientes para señalar a la nueva dirección de memoria.

  • Ventajas del algoritmo de replicación
  1. Para asegurar la continuidad del espacio, no habrá problema de "fragmentación".
  2. Sin marca y proceso claro, fácil de implementar y eficiente de ejecutar
  • Optimización del algoritmo de replicación

La memoria se divide en 1 área Eden y 2 áreas Survivor . El área Eden ocupa el 80% del espacio de memoria, y cada área Survivor ocupa el 10% del espacio de memoria. Por ejemplo, el área Eden tiene 800 MB de memoria, y cada Survivor área tiene 100 MB de memoria.
En el área Survivor, uno se llama From y el otro se llama To, y los objetos existen en los bloques Eden y From. Cuando se realiza GC, todos los objetos sobrevivientes en Eden se mueven al bloque Hasta, mientras que en Desde, los objetos sobrevivientes se determinan de acuerdo con el valor de edad. Cuando el objeto alcanza un cierto valor, se moverá a la generación anterior y el objeto que no ha alcanzado el valor se copia en el bloque A. , después de que se vacían GC, Eden y From. Después de eso, From y To intercambian roles, el nuevo From es el bloque To original, el nuevo bloque To es el bloque From original y la edad del objeto en el nuevo bloque To aumenta en 1.
Nota: El umbral de edad se puede establecer mediante -XX:MaxTenuringThreshold

Proceso MinorGC

  • Tiempo de activación:

Se activará cuando el área de Eden esté llena, pero el área de Survivor no activará GC

  • explicar

Durante la ejecución del código, se crearán continuamente varios objetos, y estos objetos se ubicarán preferentemente en el área Eden y el área Survivor1 de la nueva generación.
inserte la descripción de la imagen aquí

Si tanto el área Eden como el área Survivor1 de la nueva generación están casi llenos , se activará Minor GC en este momento para transferir los objetos sobrevivientes al área Survivor2. En este momento, todos los objetos sobrevivientes en el área de Eden se transferirán a un área de Supervivientes vacía al mismo tiempo. Entonces el área de Eden será limpiada.inserte la descripción de la imagen aquí

Luego asigne nuevos objetos al área Eden nuevamente. Hay objetos en el área Eden y un área Survivor. El área Survivor contiene objetos que sobrevivieron al último Minor GC. Si el área Eden vuelve a estar llena la próxima vez, Minor GC se activa nuevamente, y los objetos sobrevivientes en el área Eden y el área Survivor donde se colocan los objetos sobrevivientes después del último Minor GC se transferirán a otra área Survivor.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Cuando un objeto entra en la vieja generación

Según la edad objetivo

Cada vez que un objeto escapa de MinorGC en la nueva generación y se transfiere a un área de Survivor, su edad aumentará en un año. Por defecto, cuando el objeto alcance los 15 años, evitará 15. En el próximo GC, se transferirá a la vieja generación . La edad específica a la que un niño ingresa a la vejez se puede establecer a través del parámetro JVM "-XX: MaxTenuringThreshold", y el valor predeterminado es 15 años.
inserte la descripción de la imagen aquí

Juicio de edad de objetos dinámicos

Hay otra regla que permite que los objetos entren en la vejez sin esperar a que pasen 15 GC.
En el área de Superviviente actual, si el tamaño total de un lote de objetos excede el 50 % del tamaño de la memoria de esta área de Superviviente, entonces los objetos cuya edad es mayor o igual a la edad de este lote de objetos pueden ingresar directamente al antiguo edad.
inserte la descripción de la imagen aquí

Suponga que hay tres objetos en el área de Survivor2 en esta figura. La edad de estos objetos es la misma, todos tienen 3 años y los objetos combinados de los dos superan los 50 MB, que es más de la mitad de la memoria de 100 MB. tamaño del área de Survivor 2. En este momento, los objetos del área de Survivor 2 con una antigüedad igual o mayor a 3 años ingresarán a la generación anterior. Esta es la llamada regla de juicio de edad dinámica, y esta regla también permitirá que algunos objetos en la nueva generación ingresen a la edad avanzada.
Además, aquí hay un concepto para aclarar, es decir, la lógica real de esta regla es la siguiente: la suma de múltiples objetos de edad de edad 1+edad 2+edad n excede el 50% del área de Superviviente. la vieja generación .

Los objetos grandes van directamente a la vieja generación

Hay un parámetro JVM, que es " -XX:PretenureSizeThreshold ", que puede establecer su valor en el número de bytes, como "1048576" bytes, que es 1 MB. Significa que si desea crear un objeto más grande que este tamaño, como una matriz súper grande u otra cosa, puede colocar directamente este objeto grande en la generación anterior en este momento. no pasará por la nueva generación. La razón de esto es evitar la aparición de objetos tan grandes en la nueva generación, y luego evitar repetidamente GC, y luego copiar de un lado a otro entre las dos áreas de Survivor muchas veces antes de ingresar a la generación anterior.

Demasiados objetos después de Minor GC

Después del Minor GC, se descubre que quedan demasiados objetos sobrevivientes y no hay forma de colocarlos en otra área de Survivor. En este momento, estos objetos deben transferirse directamente a la generación anterior.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Reglas de garantía de asignación de espacio de generación anterior

  • pregunta lleva

Si una gran cantidad de objetos sobreviven en la nueva generación, es cierto que el área Superviviente no puede acomodarlos y debe transferirse a la generación anterior, ¿y qué si no hay suficiente espacio en la generación anterior para almacenar estos objetos?

  • resolver

En primer lugar, antes de ejecutar cualquier GC menor, la JVM primero verificará si el espacio de memoria disponible en la generación anterior es mayor que el tamaño total de todos los objetos en la nueva generación. Para evitar la situación más extrema, todos los objetos pueden sobrevivir al Minor GC en la nueva generación, y todos los objetos de la nueva generación entrarán en la generación anterior.
Si se encuentra que el tamaño de la memoria de la generación anterior es mayor que todos los objetos de la nueva generación, se puede iniciar un GC menor en la nueva generación en este momento, porque incluso si todos los objetos sobreviven después del GC menor, el Superviviente el área ya no puede caber, y se pueden transferir a la generación anterior.
Si antes de ejecutar Minor GC, se encuentra que la memoria disponible en la generación anterior es más pequeña que el tamaño de todos los objetos en la nueva generación, entonces en este momento, es posible que todos los objetos en la nueva generación sobrevivan después del Minor GC, y luego todo debe transferirse a la generación anterior, pero la generación anterior El espacio de edad no es suficiente. Entonces, si es anterior a Minor GC, verificará si está configurado un parámetro "-XX:-HandlePromotionFailure". Si existe este parámetro, continuará intentando hacer el siguiente juicio.

  • Compruebe si el tamaño de la memoria de la generación anterior es mayor que el tamaño promedio de los objetos que ingresan a la generación anterior después de cada GC menor.

Por ejemplo: después de cada GC menor, un promedio de aproximadamente 10 MB de objetos ingresarán a la generación anterior, por lo que la memoria disponible en la generación anterior en este momento es superior a 10 MB. Esto significa que es muy probable que objetos de alrededor de 10 MB ingresen a la generación anterior después del Minor GC. En este momento, el espacio en la generación anterior es suficiente y se puede reciclar.

  • Si el juicio del paso anterior falla, o el parámetro "-XX:-HandlePromotionFailure" no está configurado, se activará un "GC completo" directamente en este momento, que consiste en realizar la recolección de elementos no utilizados en la generación anterior, intente liberar cargue algo de espacio en la memoria y luego realice un GC menor.
  • Resumir

Antes de que ocurra Minor GC, la máquina virtual verifica si el espacio continuo máximo disponible en la generación anterior es mayor que el espacio total de todos los objetos en la nueva generación.

  1. Si es mayor que, este Minor GC es seguro
  2. Si es menor que, la máquina virtual verificará si el valor de configuración -XX:-HandlePromotionFailure puede fallar en la garantía.
    1. Si HandlePromotionFailure=true, continuará verificando si el espacio continuo máximo disponible en la generación anterior es mayor que el tamaño promedio de los objetos promovidos a la generación anterior.
      1. Si es más grande, intente realizar un Minor GC, pero este Minor GC sigue siendo riesgoso; si el objeto sobreviviente es más grande que el tamaño del área Survivor después del reciclaje, y también es más grande que el tamaño de la memoria disponible en el generación anterior, se producirá "Error de promoción de manejo". En este caso, se activará un "GC completo" en este momento
      2. Si es menor que eso, realice un GC completo en su lugar.
    2. Si HandlePromotionFailure=false, realice un GC completo en su lugar
  3. El parámetro HandlePromotionFailure no es válido después de JDK 7. Siempre que el espacio continuo de la generación anterior sea mayor que el tamaño total de los objetos de la nueva generación o mayor que el tamaño promedio de los objetos promovidos a la generación anterior, se realizará MonitorGC, de lo contrario GC completo

Algoritmo de recolección de basura de vieja generación

Algoritmo de clasificación de marcado

El algoritmo de recopilación de copias requiere más operaciones de copia cuando la tasa de supervivencia del objeto es alta y la eficiencia disminuirá. Más importante aún, si no desea desperdiciar el 50 % del espacio de memoria, debe proporcionar espacio adicional para las garantías de asignación. Dado que la tasa de supervivencia de los objetos en la generación anterior es relativamente alta y no se puede encontrar otra memoria para garantizar la asignación , la generación anterior generalmente no puede usar directamente este algoritmo de recopilación.
De acuerdo con las características de la generación anterior, alguien mejoró el "marcar-borrar" y propuso el algoritmo "marcar-clasificar". El proceso de marcado del algoritmo "mark-sort" es el mismo que el del algoritmo "mark-clear", pero los pasos subsiguientes no limpian directamente los objetos reciclables, sino que permiten que todos los objetos sobrevivientes se muevan hacia un extremo y luego directamente limpiar los objetos fuera del límite final.memoria .
inserte la descripción de la imagen aquí

temporización del disparador

  1. Al llamar a System.gc, el sistema sugiere ejecutar Full GC, pero no necesariamente
  2. Espacio insuficiente en la vieja generación
  3. La garantía de asignación de espacio falló
  4. JDK 1.7 y la generación permanente anterior (área de método) el espacio es insuficiente
  5. Después de Minor GC, el tamaño promedio de la generación anterior es mayor que la memoria disponible de la generación anterior
  6. Cuando CMS GC maneja basura flotante, si el espacio de nueva generación es insuficiente, se adoptará el mecanismo de garantía de asignación de espacio, y si el espacio de generación anterior es insuficiente, se activará Full GC.

Trae un GC joven cuando se ejecuta el GC antiguo

  • Condiciones de activación de OldGC
  1. Verifique antes de que ocurra el GC joven. Si el "espacio de memoria continuo disponible en la generación anterior" < "el tamaño promedio del total de objetos promovidos a la generación anterior después del GC joven en la nueva generación", significa que los objetos pueden ser promovido a la generación anterior después de este GC joven El tamaño puede exceder el espacio de memoria disponible actual de la generación anterior En este momento, se debe activar un GC antiguo para hacer más espacio para la generación anterior y luego ejecutar el GC joven
  2. Después de la ejecución de Young GC, se debe colocar un lote de objetos en la generación anterior. En este momento, la generación anterior no tiene suficiente espacio de memoria para almacenar estos objetos. En este momento, se debe activar inmediatamente un GC antiguo ( el espacio restante de la generación anterior es mayor que el promedio de la generación joven anterior que ingresa al tamaño de la generación anterior, pero los objetos que ingresan a la edad avanzada después de este reciclaje son mucho más grandes que el tamaño promedio anterior)
  3. Si la tasa de uso de memoria de la generación anterior supera el 92%, el GC antiguo debe activarse directamente. Por supuesto, esta proporción se puede ajustar a través de parámetros.

En pocas palabras, no hay suficiente espacio en la generación anterior y no se pueden colocar más objetos. En este momento, es necesario ejecutar Old GC para recolectar basura en la generación anterior.

  • explicar
  1. Si el GC antiguo es causado por la condición 1, significa que no hay espacio suficiente en la generación anterior y no se puede realizar el GC joven. Es necesario realizar el GC antiguo primero y luego el GC joven, para que el GC antiguo ocurra antes que el GC Yonug.
  2. Si es causado por la condición 2, entonces no hay espacio suficiente después de Young GC, lo que a su vez activa Old GC
  3. De hecho, en muchos mecanismos de implementación de JVM, cuando se cumplen las condiciones anteriores, en realidad se activa el GC completo.Este GC completo incluirá el GC joven, el GC antiguo y el GC de generación permanente.

Supongo que te gusta

Origin blog.csdn.net/u010859650/article/details/127975798
Recomendado
Clasificación