Comprensión simple del algoritmo de recolección de basura VM

1. Descripción

  • Las tres áreas del contador del programa, la pila de máquinas virtuales y la pila de métodos locales se generan con el hilo y se destruyen con el hilo. La asignación de memoria y el reciclaje de estas áreas son deterministas
  • La asignación de memoria y la recopilación de esta parte del área de método y montón de Java son dinámicas, y el recolector de basura está preocupado por esta parte de la memoria
Nueva generación y vieja generación

El montón en Java es el mayor espacio de memoria administrado por la JVM, que se utiliza principalmente para almacenar objetos de instancia de varias clases.
En Java, el montón se divide en dos áreas diferentes: la generación joven (Vieja) y la generación vieja (Vieja). La nueva generación (Young) se divide en tres áreas: Eden, From Survivor, To Survivor.
El modelo de memoria del montón es aproximadamente:


 
 
  • Tamaño de almacenamiento dinámico = nueva generación + generación anterior.

  • La recolección de basura generalmente ocurre en el montón de Java.

  • El área del método se llama generación permanente.


Cenozoico:

La tasa de supervivencia de los sujetos es baja.

Vieja generación:

La tasa de supervivencia del sujeto es alta.


2. Juzgue si los objetos en el montón están muertos (objetos que ya no se pueden usar de ninguna manera)

2.1 Algoritmo de conteo de referencia

Significado:

Agregue un contador de referencia al objeto. Siempre que haya una referencia a él, el contador se incrementa. Cuando la referencia no es válida, el contador se reduce. Cualquier objeto cuyo contador sea 0 en cualquier momento no se puede usar.

Desventajas

Es difícil resolver el problema de las referencias circulares entre objetos.

Ejemplos:

En el siguiente ejemplo: objetos y los objetos tienen objA instancia de campo objB, asignado para hacer objA.instance = objBy objB.instance = objA, además, los dos objetos sin ninguna referencia al hecho de que los dos objetos han sido imposibles de visita, pero debido a que se refieren el uno al otro con La otra parte, de modo que sus recuentos de referencia no sean 0, por lo que el algoritmo de recuento de referencias no puede reciclarlos a través del recopilador GC.

public class ReferenceCountingGC {

    public Object instance = null; private static final int _1MB = 1024 * 1024; // 这个成员属性的唯一意义就是占点内存,以便能在GC 日志中看清楚是否被回收过 private byte[] bigSize = new byte[2 * _1MB]; public static void main(String[] args) { ReferenceCountingGC objA = new ReferenceCountingGC(); ReferenceCountingGC objB = new ReferenceCountingGC(); objA.instance = objB; objB.instance = objA; objA = null; objB = null // 假设在这行发生 GC,那么 objA 和 objB 是否能被回收 System.gc(); } } 

Nota: Parámetros de configuración de opciones de VM:-verbose:gc -XX:+PrintGCDetails

Los resultados de la impresión parcial son los siguientes:

[GC (System.gc()) [PSYoungGen: 6772K->680K(38400K)] 6772K->680K(125952K), 0.0098335 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [Full GC (System.gc()) [PSYoungGen: 680K->0K(38400K)] [ParOldGen: 0K->623K(87552K)] 680K->623K(125952K), [Metaspace: 3213K->3213K(1056768K)], 0.0145286 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

El resultado se puede ver en el registro de GC 6772K->680K, lo que significa que la máquina virtual no recicla los dos objetos porque se refieren entre sí, lo que indica que la máquina virtual no utiliza el algoritmo de conteo de referencia para determinar si el objeto está vivo.

2.2 Algoritmo de búsqueda raíz (algoritmo de análisis de accesibilidad)

Significado:

A través de una serie de objetos llamados "GC Roots" como punto de partida, busque desde estos nodos hacia abajo. El camino que toma la búsqueda se denomina cadena de referencia. Cuando un objeto está conectado a GC Roots sin ninguna cadena de referencia (utilizando la teoría de gráficos En otras palabras, desde GC Roots hasta este objeto no se puede alcanzar), demuestra que este objeto no está disponible.

Objetos de raíz de GC:
  • Objetos referenciados en la pila de máquina virtual (tabla de variables locales del marco de la pila)
  • El objeto al que hace referencia la propiedad estática de clase en el área de método
  • Método para ir al objeto al que hace referencia la constante
  • Objetos a los que hace referencia JNI (es decir, métodos nativos en general) en la pila de métodos locales

(En el área del método y la pila)

Ejemplos:
 
 

Los objetos object5, object6 y object7 están relacionados entre sí, pero son inalcanzables para GC Roots, por lo que serán juzgados como objetos reciclables.


3. Algoritmo de recolección de basura

3.1 Algoritmo de marca clara

Significado:

Primero marque todos los objetos que necesitan ser recuperados, y recoja todos los objetos marcados después de que se complete el etiquetado.

Desventajas
  1. Ineficiente
  2. Demasiados desechos espaciales
Ejemplos:
 
 

3.2 Algoritmo de copia (generalmente usado en la nueva generación)

Significado:

Divida la memoria disponible en dos bloques de igual tamaño según la capacidad, y use solo uno de ellos a la vez. Cuando este bloque de memoria se agota, copie los objetos supervivientes en otro bloque y luego limpie el espacio de memoria usado una vez.

Desventajas

Para reducir la memoria a la mitad del original, el costo es demasiado alto.

Mejora:

Divide la memoria en un espacio Eden más grande y dos espacios Survivor más pequeños, usando Eden y uno de los Survivor cada vez. Al reciclar, copie los objetos sobrevivientes en Eden y Survivor en otro espacio de Survivor a la vez, y finalmente limpie el espacio de Eden y Survivor que acaba de usar.

Ejemplos:
 
 

3.3 Algoritmo de marcado-clasificación (generalmente utilizado en la generación anterior)

Significado:

Deje que todos los objetos supervivientes se muevan a un extremo y luego limpie directamente la memoria más allá del límite final.

Ejemplos:
 
 

3.4 Algoritmo de colección generacional

Significado:

La memoria se divide en varios bloques según el ciclo de vida del objeto. Generalmente, el montón de Java se divide en la nueva generación y la generación anterior, y luego se adopta el algoritmo de recopilación más apropiado de acuerdo con las características de cada generación.

  • La nueva generación: algoritmo de replicación
  • Old Generation: Mark-Organize / Mark-Organize

Ahora básicamente usa esto.


-----------------------------
Enlace original: https://www.jianshu.com/p/a0f4144356af
 

Supongo que te gusta

Origin www.cnblogs.com/suger43894/p/12673437.html
Recomendado
Clasificación