JVM Serie 3: algoritmos y recolección de basura

  1. Cómo determinar la basura
    1. conteo de referencia
              En Java, las referencias y los objetos están relacionados. Si desea manipular objetos, debe utilizar referencias. Por lo tanto, es obvio que una forma sencilla es utilizar el recuento de referencias para determinar si un objeto se puede reciclar. En pocas palabras, si un objeto no tiene ninguna referencia asociada, es decir, su recuento de referencias no es 0, significa que es poco probable que el objeto se vuelva a utilizar, entonces el objeto es un objeto reciclable.
    2. análisis de accesibilidad
              Para resolver el problema de referencia circular del método de recuento de referencias, Java utiliza el método de análisis de accesibilidad. Busque en una serie de objetos "raíces de GC" como punto de partida. Se dice que un objeto es inalcanzable si no existe una ruta accesible entre las "raíces del GC" y el objeto. Cabe señalar que los objetos inalcanzables no equivalen a objetos reciclables. Los objetos inalcanzables deben pasar por al menos dos procesos de marcado para convertirse en objetos reciclables. Si sigue siendo un objeto reciclable después de haber sido marcado dos veces, se enfrentará al reciclaje.
  2. Algoritmo de barrido de marcas ( Mark-Sweep )

    De la figura, podemos encontrar que el mayor problema de este algoritmo es la grave fragmentación de la memoria, y pueden ocurrir problemas posteriores donde los objetos grandes no pueden encontrar espacio disponible.
     

    1. El algoritmo de recolección de basura más básico se divide en dos etapas: marcado y limpieza. La fase de marcado marca todos los objetos que necesitan ser reciclados y la fase de limpieza recupera el espacio ocupado por los objetos marcados. Como se muestra en la imagen
  3. Algoritmo de copia ( copiar )

           Un algoritmo propuesto para solucionar el defecto de fragmentación de la memoria del algoritmo Mark-Sweep. Divida la memoria en dos bloques de igual tamaño según la capacidad de la memoria. Utilice solo un bloque a la vez. Cuando este bloque de memoria esté lleno, copie los objetos supervivientes en otro bloque y borre la memoria utilizada, como se muestra en la figura:

    Aunque este algoritmo es simple de implementar, tiene una alta eficiencia de memoria y no es propenso a fragmentarse, el mayor problema es que la memoria disponible está comprimida a la mitad del tamaño original. Y si aumenta la cantidad de objetos supervivientes, la eficiencia del algoritmo de copia se reducirá considerablemente.

  4. Algoritmo Mark Compact (Mark-Compact)

    Se propone una combinación de los dos algoritmos anteriores para evitar defectos. La fase de marcado es la misma que la del algoritmo Mark-Sweep: después del marcado, los objetos no se limpian, pero los objetos supervivientes se mueven a un extremo de la memoria. Luego borre los objetos fuera del límite final. Como se muestra en la imagen:
  5. Algoritmo de recopilación generacional
    1. El método de recopilación generacional es utilizado actualmente por la mayoría de las JVM. Su idea central es dividir la memoria en diferentes dominios de acuerdo con los diferentes ciclos de vida de los objetos. Generalmente, el montón de GC se divide en Tenured/Old Generation y Young Generation. La característica de la generación anterior es que solo es necesario reciclar una pequeña cantidad de objetos en cada recolección de basura. La característica de la nueva generación es que es necesario reciclar una gran cantidad de basura en cada recolección de basura. Por lo tanto, se pueden usar diferentes algoritmos. ser seleccionado según diferentes áreas.
    2. Algoritmo de nueva generación y replicación.

      En la actualidad, la mayoría de los GC JVM adoptan el algoritmo de copia para la nueva generación, porque la mayoría de los objetos deben recuperarse durante cada recolección de basura en la nueva generación, es decir, hay relativamente pocas operaciones de copia, pero la nueva generación generalmente no se divide según 1:1. Generalmente, la nueva generación se divide en un espacio Eden más grande y dos espacios Survivor más pequeños (From Space, To Space). Cada vez que se utilizan el espacio Eden y una parte del espacio Survivor, cuando se realiza el reciclaje, los dos espacios Los objetos supervivientes se copian a otro espacio de Survivor.
    3. Algoritmo de replicación marcada y de vieja generación.
       

      La generación anterior solo recicla una pequeña cantidad de objetos cada vez, por lo que utiliza el algoritmo Mark-Compact.

      1. La Generación Permanente (Generación Permanente) en el área de métodos mencionada por la máquina virtual JAVA se utiliza para almacenar clases, constantes, descripciones de métodos, etc. El reciclaje de la generación eterna incluye principalmente constantes descartadas y clases inútiles.

      2. La asignación de memoria de los objetos se realiza principalmente en el Eden Space de la nueva generación y en el From Space del Survivor Space (el bloque donde Survivor actualmente almacena objetos), y en algunos casos se asignará directamente a la generación anterior. .

      3. Cuando el Eden Space y From Space de la nueva generación sean insuficientes, se producirá un GC. Después del GC, los objetos supervivientes en las áreas Eden Space y From Space se trasladarán al To Space, y luego al Eden Space y From. Se limpiará el espacio.

      4. Si To Space no puede almacenar un objeto lo suficiente, el objeto se almacenará en la generación anterior.

      5. Después de GC, se utilizan Eden Space y To Space y se repite el ciclo.

      6. Cuando un objeto escapa de un GC en el área de Superviviente, su edad será +1. De forma predeterminada, los objetos cuya edad alcance los 15 años se trasladarán a la generación anterior.

        

Supongo que te gusta

Origin blog.csdn.net/weixin_38340874/article/details/122082316
Recomendado
Clasificación