¿Cómo funciona el mecanismo de recolección de basura?

¿Qué es el mecanismo de recolección de basura?

La recolección de basura es un mecanismo de administración de almacenamiento automático. Cuando ya no se necesita algo de memoria ocupada, se debe liberar para hacer espacio.Esta administración de recursos de almacenamiento se llama recolección de basura.

En otras palabras, la recolección de basura está relacionada con la memoria, entonces, ¿qué memoria hay?

Memoria JVM

JVM divide la memoria en cinco secciones.

JVM se divide en cinco espacios de memoria. Entre ellos, el contador del programa, la pila de la máquina virtual y la pila del método local se generan y destruyen con subprocesos. Por lo tanto, la asignación de memoria y la recuperación de estas áreas son deterministas y no es necesario pasar Considere el tema del reciclaje, porque cuando el método termina o el hilo termina, la memoria seguirá naturalmente al reciclaje. El área de almacenamiento dinámico de Java y el área de métodos son diferentes, la asignación y recuperación de esta parte de la memoria son dinámicas, que es exactamente la parte a la que el recolector de basura debe prestar atención.

Recolección de basura en el área del montón

Que es basura

Si un objeto no tiene un lugar para hacer referencia a él, es basura.

Cómo determinar si es basura

Recuento de referencias

Agregue un contador de referencia al objeto. Siempre que haya una referencia al mismo, el contador se incrementa en uno. Por el contrario, cada vez que falla una referencia, el contador se reduce en uno. Cuando el contador es 0, significa que no se hace referencia al objeto.

Análisis de accesibilidad

Configure una cantidad de objetos raíz (GC Root), cada objeto es un nodo hijo, cuando un objeto no puede encontrar la raíz, se considera inalcanzable.

Condiciones desencadenantes

Mecanismo de activación de GC menor

El GC menor se activará cuando la generación joven esté completa. La generación joven aquí se refiere a la generación Edén, y el Superviviente completo no activará el GC.

Mecanismo de disparo FULL GC

  1. Espacio insuficiente en la vejez
  2. Área de método insuficiente
  3. El tamaño medio de la generación anterior después de pasar el GC menor es mayor que la memoria disponible de la generación anterior.
  4. Al copiar desde el área de Eden y el área de From Survivor al área de To Survivor, si el tamaño del objeto es mayor que la memoria disponible de To Space, el objeto se volcará a la generación anterior, y la memoria disponible de la generación anterior es más pequeña que el tamaño del objeto.
  5. Llamada al método System.gc (), el sistema recomienda implementar Full GC, pero no necesariamente se implementa.

Algoritmo de recuperación

1. Algoritmo Mark-clear

El algoritmo primero marca, luego borra, atraviesa todas las Raíces GC, marca los objetos alcanzables e inalcanzables respectivamente, y luego recupera los objetos inalcanzables.

Las deficiencias de este algoritmo se reflejan principalmente en la eficiencia y el espacio.

Desde el punto de vista de la eficiencia, los dos procesos de marcado y limpieza no son eficientes, porque es necesario atravesar todas las RAÍCES de GC.

Desde una perspectiva espacial, se generará una gran cantidad de fragmentos de memoria discontinuos después de que se borre la marca. Demasiados fragmentos de memoria pueden hacer que no se encuentre suficiente memoria contigua cuando es necesario asignar objetos grandes durante la ejecución del programa y deben activarse con anticipación. Acción de recolección de basura.

2. Copiar algoritmo

Divida la memoria en dos bloques y use solo un bloque cada vez. Cuando este bloque de memoria esté lleno, copie los objetos supervivientes a otro bloque y organícelos estrictamente de acuerdo con la dirección de memoria, y luego recicle la memoria usada.

La ventaja es: resuelve el problema de fragmentación del algoritmo de barrido de marcas y puede obtener espacio de memoria continuo. La
desventaja es: la mitad de la memoria se desperdicia

3. Algoritmo de marcado y clasificación

Cuando la tasa de supervivencia del objeto es alta, la eficiencia de replicación continua del algoritmo de replicación es muy baja. La vejez es un objeto que no es fácil de reciclar. Según las características de la vejez, se puede utilizar el algoritmo de clasificación de etiquetas. El algoritmo de clasificación de etiquetas se basa en el algoritmo de marca-barrido. Después de marcar, no limpiar directamente, es dejar que todos los objetos supervivientes se muevan hacia un extremo y luego limpiar directamente la memoria fuera del límite. Esto no solo evita la replicación continua cuando la tasa de supervivencia del objeto es alta, sino que también evita la aparición de fragmentación de la memoria. Adecuado para Vejez.

4. Algoritmo de recopilación generacional

Las máquinas virtuales comerciales modernas básicamente utilizan algoritmos de recolección generacional para la recolección de basura. No hay nada especial en este algoritmo, es una combinación de los anteriores.

Divide los objetos en la memoria de acuerdo con la duración de su ciclo de vida y la diferencia en el área.

El montón se divide en la nueva generación y la vieja generación.

El área de método es la generación persistente.

La nueva generación es un objeto que no vivirá mucho antes de morir, normalmente en la memoria del montón, como las variables locales.

La vejez es un objeto longevo pero también muerto, generalmente en la memoria del montón, por ejemplo, algunos objetos longevos.

La generación persistente es un objeto inmortal, generalmente en el área de método, por ejemplo, la información de clase cargada.

Las diferentes épocas utilizan diferentes algoritmos de recolección de basura.

La nueva generación utiliza un algoritmo de replicación.

La vejez utiliza un algoritmo de clasificación de etiquetas.

Recolección de basura en el área de método

La generación persistente es el área de método. La especificación de la máquina virtual Java dice que no es necesario requerir que la máquina virtual implemente la recolección de basura en el área de método, porque en comparación con la eficiencia de recolección de basura del área de almacenamiento dinámico, su eficiencia de reciclaje es demasiado baja, pero esta parte del área de memoria También se puede reciclar.

La nueva generación y la generación anterior de la generación persistente y el área de almacenamiento dinámico son diferentes Los contenidos principales del área de métodos son constantes descartadas y clases inútiles.

Las constantes obsoletas también se pueden juzgar por la accesibilidad de la referencia, pero para las clases inútiles, las siguientes tres condiciones deben cumplirse al mismo tiempo:

  • Todas las instancias de esta clase se han reciclado, es decir, no hay ninguna instancia de esta clase en el montón de Java;
  • La carga de esta clase ClassLoaderse ha reciclado;
  • java.lang.ClassNo se hace referencia al objeto correspondiente de esta clase en ninguna parte y no se puede acceder a los métodos de esta clase mediante la reflexión en ninguna parte .

Supongo que te gusta

Origin blog.csdn.net/numbbe/article/details/109321901
Recomendado
Clasificación