[JVM] algoritmo de recolección de basura

teoría de la colección generacional

La mayoría de los recolectores de basura actuales para máquinas virtuales comerciales están diseñados según la regla general de la teoría de la "Recolección Generacional" [1], que se basa en dos hipótesis generacionales:

  1. Hipótesis generacional débil: la mayoría de los objetos son efímeros.

  2. Hipótesis generacional fuerte (hipótesis generacional fuerte): cuantos más objetos sobrevivan al proceso de recolección de basura, más difícil será perecer.

Al poner la teoría de la colección generacional en la máquina virtual Java comercial actual, los diseñadores generalmente dividen el montón de Java en al menos dos áreas: la generación joven y la generación anterior [2]. Como sugiere el nombre, en la nueva generación, una gran cantidad de objetos mueren cada vez que se recolecta basura, y una pequeña cantidad de objetos que sobrevivan a cada recolección se promoverán gradualmente a la generación anterior para su almacenamiento.

Para la teoría generacional, dado que habrá casos en los que la generación anterior se refiere a la nueva generación, esto tendrá un impacto en el rendimiento del juicio al reciclar objetos, por lo que también se deben hacer las siguientes suposiciones

  1. Hipótesis de referencia intergeneracional (hipótesis de referencia intergeneracional): las referencias intergeneracionales son solo un número muy pequeño en comparación con las referencias de la misma generación.

La conclusión anterior puede derivarse de la inferencia implícita basada en el razonamiento lógico de las dos primeras hipótesis: dos objetos que tienen una relación de referencia mutua deberían tender a vivir o morir al mismo tiempo.

Aquí hay algunos sustantivos comunes de colecciones generacionales.

  • Recolección parcial (GC parcial) : se refiere a la recolección de basura cuyo objetivo no es recolectar por completo todo el montón de Java, que se divide en:

    • Minor GC/Young GC : Se refiere a la recolección de basura cuyo objetivo es solo la nueva generación.

    • Recolección de generación anterior (GC principal/GC antiguo) : se refiere a la recolección de basura dirigida solo a la generación anterior. En la actualidad, solo el recopilador CMS tiene el comportamiento de recopilar por separado la generación anterior.

    • Recolección mixta (GC mixta) : Se refiere a la recolección de basura cuyo objetivo es recolectar toda la nueva generación y parte de la generación anterior. Actualmente sólo el colector G1 muestra este comportamiento.

  • Colección de montón completo (GC completo) : recolección de basura que recopila todo el área de método y montón de Java.

algoritmo de barrido de marcas

El algoritmo de marca y barrido (algoritmo de marca y barrido) es un algoritmo clásico de recolección de basura que se utiliza para identificar y liberar objetos a los que ya no se hace referencia, recuperando así espacio de memoria. Consta de dos fases principales: Marcar y Barrido.

Así es como funciona el algoritmo de marcar y barrer:

  1. Etapa de marca (marca) :
    • Comenzando desde el objeto raíz (generalmente el punto de entrada del programa o la variable global), recorra todo el gráfico de objetos y marque todos los objetos a los que se puede acceder desde el objeto raíz.
    • En esta etapa, los objetos marcados generalmente se marcan con un bit de marca o se agregan a un conjunto "marcado" para indicar que son objetos activos y todavía se hace referencia a ellos.
  2. Fase de barrido :
    • Durante la fase de limpieza, el recolector de basura atraviesa toda la memoria del montón y encuentra todos los objetos sin marcar, que son objetos a los que ya no se hace referencia.
    • Los objetos no marcados se consideran basura y el recolector de basura marca su espacio de memoria como espacio libre para futuras asignaciones de objetos.
    • Después de borrar, solo los objetos marcados permanecen en la memoria del montón y la memoria de los objetos no marcados se libera.

Una cosa a tener en cuenta arriba es que los objetos marcados pueden ser todos los objetos que deben reciclarse. Una vez completado el marcado, todos los objetos marcados se reciclarán de manera uniforme o, a su vez, los objetos supervivientes se marcarán y todos los objetos no marcados se reciclarán. reciclado uniformemente. .

El siguiente es un diagrama esquemático del algoritmo de borrado de marcas.

imagen-20230904194201368

La ventaja del algoritmo de marcar y barrer es que puede recuperar objetos a los que ya no se hace referencia, pero también tiene algunas desventajas:

  • Problemas de fragmentación : el algoritmo de barrido de marcas deja bloques libres discontinuos en la memoria, lo que puede provocar problemas de fragmentación de la memoria. Esto aumenta el riesgo de problemas de falta de espacio al asignar objetos grandes.
  • Problemas de eficiencia : el algoritmo de marcado y borrado necesita atravesar toda la memoria del montón dos veces: una para marcar y otra para borrar. Esto genera una sobrecarga de rendimiento adicional, especialmente durante la fase de limpieza.
  • Problema de detención : el algoritmo de marca y barrido necesita detener la ejecución de la aplicación durante la fase de limpieza, porque requiere que toda la memoria del montón esté en un estado constante para realizar la operación de limpieza. Esto puede hacer que la aplicación se detenga durante la recolección de basura, lo que afecta la experiencia del usuario.

algoritmo de marca-copia

El algoritmo de marca y copia (algoritmo de marca y copia) es un algoritmo de recolección de basura que resuelve el problema de fragmentación de la memoria que ocurre en el algoritmo de marca y borrado. El algoritmo de marca-copia se utiliza principalmente para la recolección de basura de la generación joven (Generación Joven) y generalmente se divide en dos etapas: marcar (Marcar) y copiar (Copiar).

Así es como funciona el algoritmo de marcar y copiar:

  1. Etapa de marca (marca) :

    • A partir del objeto raíz (generalmente el punto de entrada del programa o una variable global), se recorre todo el gráfico del objeto, marcando todos los objetos a los que se puede llegar desde el objeto raíz, y estos objetos se consideran objetos activos.
    • En esta etapa, los objetos marcados generalmente se marcan con un bit de marca o se agregan a un conjunto "marcado" para indicar que son objetos activos y todavía se hace referencia a ellos.
  2. Fase de copia (copia) :

    • Durante la fase de copia, el recolector de basura copia todos los objetos marcados como objetos vivos de un área (a menudo llamada área "De" o "Eden") a otra área (a menudo llamada área "Para" o "Superviviente").
    • Después de copiar, todos los objetos copiados se organizan consecutivamente sin fragmentación y el área "Desde" queda vacía.
  3. Fase de limpieza :

    • Los objetos que se copian ya no son necesarios durante la fase de limpieza, por lo que se puede vaciar toda el área "De" para convertirla en nuevo espacio libre para futuras asignaciones de objetos.

El diagrama esquemático es el siguiente.

imagen-20230904195708455

La principal ventaja del algoritmo de marca-copia es que resuelve eficazmente el problema de la fragmentación de la memoria. Debido a que los objetos copiados están ordenados juntos, el área "De" queda vacía, por lo que no habrá fragmentación de la memoria. Esto mejora la utilización de la memoria y reduce posibles problemas de falta de espacio al asignar objetos grandes. La desventaja es que es una pérdida de espacio.

El algoritmo de marca-copia se utiliza principalmente para la recolección de basura en la generación joven, mientras que la generación anterior generalmente usa otros algoritmos, como el algoritmo de barrido de marca o el algoritmo de marca compacta. Estos diferentes algoritmos de recolección de basura se combinan para formar una estrategia compleja de recolección de basura en las máquinas virtuales Java modernas para mejorar la eficiencia y el rendimiento de la administración de la memoria.

Algoritmo de clasificación de marcas

El algoritmo Mark and Compact (algoritmo Mark and Compact) es un algoritmo de recolección de basura, generalmente utilizado para la recuperación de memoria en la vieja generación (vieja generación). Es una versión mejorada del algoritmo de borrado de marcas, que resuelve principalmente el problema de fragmentación de memoria que puede causar el algoritmo de borrado de marcas.

En comparación con el algoritmo de borrado de marcas, solo existe un proceso de clasificación más.

Etapa de acabado (compacta) :

  • Durante la fase de orden, el recolector de basura mueve todos los objetos marcados como activos hacia un extremo para que se alineen de forma contigua. Al mismo tiempo, los objetos marcados/no marcados se consideran basura, ya no son necesarios y se liberará su espacio de memoria.
  • Después de la clasificación, los objetos activos en la memoria se vuelven más compactos sin fragmentación, lo que puede mejorar la utilización de la memoria.

El diagrama esquemático es el siguiente.

imagen-20230904200134998

Supongo que te gusta

Origin blog.csdn.net/m0_51545690/article/details/132676846
Recomendado
Clasificación