Algoritmo de recolección de basura JVM de conocimientos básicos de Java

Algoritmo de recolección de basura

4 ideas principales de algoritmos de recolección de basura

Recuento de referencias
Copia de copia
Eliminación de
marcas Clasificación de marcas

Una característica importante del lenguaje Java es que puede realizar automáticamente el procesamiento de recolección de basura sin que el desarrollador preste demasiada atención a la liberación de recursos del sistema. Aunque la recolección automática de basura reduce en gran medida la carga de trabajo de los desarrolladores, también aumenta la carga sobre el sistema de software. Un método y una estrategia de recolección de basura inapropiados afectarán negativamente al rendimiento del sistema.

1. Recuento de referencias

El método de recuento de referencias es el método de recolección de basura más clásico y antiguo, y su implementación también es muy simple: para un objeto A, siempre que cualquier objeto haga referencia a A, el contador de A aumenta en 1, y cuando la referencia no es válida, el contador de referencia Disminuir 1. Mientras el valor del contador de referencia del objeto A sea 0, el objeto A ya no se puede utilizar.

El método de conteo de referencias es simple de implementar, solo necesita estar equipado con un contador de enteros para cada objeto. Sin embargo, tiene un problema grave, es decir, no puede manejar referencias circulares, por lo que este algoritmo no se usa en el recolector de basura de Java.

Un ejemplo de referencia circular simple es el siguiente:

Inserte la descripción de la imagen aquí

El Objeto A y el Objeto B están referenciados cíclicamente. En este momento, sus contadores de referencia no son 0, pero el tercer objeto no se puede encontrar en el sistema que hace referencia a A o B. Es decir, A y B deben reciclarse como basura . Sin embargo, no se puede reconocer debido a referencias circulares, que eventualmente pueden conducir a pérdidas de memoria.

2. Método de marcar y barrer

El método de barrido de marcas es la base de los algoritmos modernos de recolección de basura.

Divide la recogida de basura en dos fases: fase de marcado y fase de limpieza. Una posible implementación es:

  • En la fase de marcado, se marcan todos los objetos accesibles a partir del nodo raíz. Por lo tanto, todos los objetos sin marcar son objetos basura sin referencia.
  • En la fase de eliminación, se eliminan todos los objetos sin marcar.

El mayor problema que puede causar el método de marcar y barrer son los desechos espaciales. El espacio después del reciclaje no es continuo y la eficiencia de trabajo del espacio de memoria discontinuo es menor que la del espacio continuo, lo que constituye la mayor deficiencia del método de marcado y barrido.

3. Copiar algoritmo

En comparación con el método de barrido de marcas, el algoritmo de copia es un algoritmo de recuperación relativamente eficiente.

Su idea central es: dividir la memoria en dos partes y usar solo una parte cada vez. Durante la recolección de basura, los objetos de inventario en la memoria que se usa se copian en el bloque de memoria no usado, y luego se borran todos los objetos en el bloque de memoria que se está usando y se intercambian las funciones de las dos memorias para completar la recolección de basura.

Si hay muchos objetos basura en el sistema, la cantidad de objetos activos que el algoritmo de replicación necesita para replicar no será grande, por lo que es más eficiente cuando es necesario usar el algoritmo de replicación. Y debido a que todos los objetos se copiarán de manera uniforme en el nuevo espacio de memoria, se puede garantizar que el espacio de memoria recuperado esté libre de fragmentación.

Aunque existen las dos ventajas anteriores, la desventaja de costo del algoritmo de copia es que la memoria del sistema se reduce a la mitad. Por lo tanto, un algoritmo de copia simple será inaceptable.

En el recolector de basura en serie de nueva generación de Java, se utiliza un algoritmo de copia. La nueva generación se divide en tres partes: eden space, desde el espacio y hacia el espacio. Los espacios desde y hacia pueden considerarse como dos bloques espaciales del mismo tamaño, el mismo estado y funciones intercambiables para copiar. También se denominan espacio de superviviente, es decir, espacio de superviviente, que se utiliza para almacenar objetos no recuperados .

Durante la recolección de basura, los objetos supervivientes en el espacio eden se copiarán al espacio superviviente no utilizado (asumiendo que), y los objetos jóvenes en el espacio superviviente (asumiendo que son de) que se estén utilizando también se copiarán en el espacio a ( Los objetos grandes u objetos de edad avanzada ingresarán directamente a la vejez, si el espacio está lleno, los objetos también ingresarán directamente a la vejez). En este momento, los objetos restantes en el eden y de los espacios serán objetos de basura y se pueden vaciar directamente, y el espacio almacenará los objetos que sobrevivieron a la colección.

Este algoritmo de copia mejorado no solo garantiza la continuidad del espacio, sino que también evita desperdiciar una gran cantidad de espacio en la memoria.

4. Algoritmo de compresión de marcas

La eficiencia del algoritmo de replicación se basa en la premisa de que hay pocos objetos supervivientes y muchos objetos basura. Esta situación es común en la generación joven, pero en la generación anterior, es más común que la mayoría de los objetos sean objetos supervivientes. Si se utiliza el algoritmo de replicación, el costo de replicación será alto debido a la gran cantidad de objetos supervivientes.

Basándose en las características de la recolección de basura en la vejez, es necesario utilizar nuevos algoritmos, y el algoritmo de compresión de marcas es un algoritmo de reciclaje de la vejez, que ha realizado algunas optimizaciones en el algoritmo de barrido de marcas.

Se diferencia del algoritmo de marca y barrido en que comprime todos los objetos activos en el otro extremo de la memoria durante la fase de limpieza. Luego, despeje todo el espacio fuera del límite. Este algoritmo no solo evita la generación de fragmentos, sino que tampoco requiere dos piezas del mismo espacio de memoria, por lo que es rentable.

5. Algoritmo incremental

Para la mayoría de los algoritmos de recolección de basura, durante el proceso de recolección de basura, todos los subprocesos del software de la aplicación se suspenderán, suspenderán todo el trabajo normal y esperarán a que se complete la recolección. Si la recolección de basura lleva mucho tiempo, la aplicación se suspenderá durante mucho tiempo, lo que afectará seriamente la experiencia del usuario y la estabilidad del sistema.

La idea básica del algoritmo incremental es permitir que los subprocesos de recolección de basura y los subprocesos de aplicación se ejecuten alternativamente, recolectando solo una pequeña área de espacio de memoria cada vez y luego cambiando los subprocesos de la aplicación. Así que de ida y vuelta hasta que se complete la recolección de basura.

El uso de este método para la recolección de basura puede reducir el tiempo de pausa del sistema, pero debido al consumo de cambio de subprocesos y cambio de contexto, el costo total de la recolección de basura aumentará, lo que resultará en una disminución en el rendimiento del sistema.

6. Generaciones

Ninguno de los varios algoritmos de recolección de basura presentados anteriormente puede reemplazar completamente a otros algoritmos, y tienen sus propias ventajas y desventajas. Por lo tanto, de acuerdo con las características de los objetos de recolección de basura, es una buena elección utilizar algoritmos apropiados para la recolección.

En esta idea se basa la generación de generación, que divide el área de la memoria en varios bloques según las características del objeto, según las características de cada bloque de memoria se utilizan diferentes algoritmos de reciclaje para mejorar la eficiencia de la recolección de basura.

imagen

Margen

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Marcar claro

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Copiar algoritmo

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Algoritmo de recopilación generacional

Para ser precisos, es diferente de los tres algoritmos anteriores. El algoritmo de recopilación generacional utiliza los tres algoritmos anteriores para recopilar según la edad del objeto.

  1. Para la nueva generación: cada GC tiene una gran cantidad de objetos que mueren y pocos sobreviven. El algoritmo de replicación se usa a menudo y solo es necesario copiar unos pocos objetos.
  2. Para la vejez: a menudo se utilizan algoritmos de definición estándar o enteros estándar.

referencia

"Comprensión profunda de la máquina virtual Java: características avanzadas y mejores prácticas de JVM" (Segunda edición)
Varias ideas de algoritmos de recolección de basura sobre JVM
Seis algoritmos e ideas principales de recolección de basura

Supongo que te gusta

Origin blog.csdn.net/e891377/article/details/108776921
Recomendado
Clasificación