Compartir tecnología

[Algoritmo y recolector de recolección de basura de GC]

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Autor: ofLJli
Enlace: https://juejin.cn/post/7003213289425633287?searchId=20240709085629749958B21D886D4E67D4
Fuente: Pepitas de tierras raras
Los derechos de autor pertenecen al autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.


Descripción general

Las estructuras principales de la JVM son: pila de máquina virtual, montón y área de método. El compilador determina el tamaño del marco de la pila de la máquina virtual. Con el final del método o la tecnología de subprocesos, la memoria de la pila de la máquina virtual también se recicla. El montón de Java y el área de métodos tienen incertidumbres significativas. La asignación y el reciclaje de esta parte de la memoria son dinámicos. Lo que le preocupa al GC es cómo administrar esta parte de la memoria.

Este artículo se centra en las siguientes tres cosas que GC debe lograr:

  • ¿Cuándo reciclar? (Condiciones que desencadenan GC)
  • Algoritmo de recolección de basura
  • Recolector de basura

cuando reciclar

Según dos hipótesis generacionales:绝大多数的对象都是朝生夕死熬过越多次的GC回收的对象就越难回收 . El montón se divide en generaciones: la nueva generación (Eden, From, To), la generación anterior y el reciclaje generacional también se realizan durante la GC.

imagen.png

GC menor : Reciclar objetos no utilizados en la nueva generación La característica de la mayoría de los objetos de la nueva generación es que viven y mueren de la noche a la mañana. Los tiempos de activación son:

  • El espacio insuficiente en el área de Eden activa el GC menor. Dado que el espacio de Eden tiene un tamaño limitado, el GC menor se activa con más frecuencia. Esto requiere un algoritmo de recopilación rápido y eficiente, que se usa generalmente.标记-复制算法Recicle esta área (se analiza más adelante).

GC mayor : Reciclar objetos no utilizados en la vieja generación.uso general标记-清除算法o标记-整理算法Reciclar.

GC completo : Recicle los objetos no utilizados en el montón y el área de métodos. El rango de reciclaje de GC completo es relativamente grande y un tiempo de ejecución prolongado puede provocar retrasos, por lo que la cantidad de GC completo debe reducirse tanto como sea posible. Los tiempos de activación son aproximadamente los siguientes:

  • El espacio insuficiente en la generación anterior se debe a que los objetos de nueva generación ingresan a la generación anterior, los objetos grandes ingresan directamente a la generación anterior, etc. Si estos objetos no se pueden almacenar en el espacio continuo máximo de la generación anterior, se realizará un reciclaje completo de GC. .

  • Espacio insuficiente en el área del método. El área del método almacena principalmente información de tipo y grupos constantes. También existe el riesgo de que no haya suficiente espacio y se realizará el reciclaje completo del GC.

  • System.gc() se llama explícitamente y Full GC lo reciclará.

Tres algoritmos de recolección de basura:

1. Algoritmo de marcar y barrer

Principio: uso可达性分析算法Hacer objetos no disponiblesmarcay luego realice elClaro . Desventajas: la eficiencia del marcado es baja cuando hay muchos objetos. Después de borrar el objeto, se producirá una fragmentación de la memoria y la memoria será discontinua. Propósito: algunos recopiladores utilizarán este algoritmo en colecciones de generación anterior.

2. Algoritmo de marca-copia

Principio: divida el espacio de memoria en dos, la mitad se usa para almacenamiento de objetos y la otra mitad está libre.Si la zona donde se guardan los objetos está llena, utilice可达性分析算法Mover objetos vivosmarcasal y luegoCopiar Vaya a otra área vacía y borre todas las áreas anteriores en espacios vacíos continuos. Desventaja: si hay muchos objetos supervivientes, se requerirá una gran cantidad de copia y desarrollo de memoria. El espacio de memoria solo puede utilizar la mitad de las ventajas y desperdiciar recursos. Función: este algoritmo de reciclaje se utiliza generalmente para objetos que viven y mueren en la nueva generación. Sin embargo, el algoritmo de replicación se ha optimizado en la nueva generación, pero este algoritmo agrega un mecanismo de garantía de asignación para evitar que se asignen demasiados objetos supervivientes. Se utiliza un algoritmo de reciclaje estilo Appel:

imagen.png

3. Algoritmo de clasificación y marcado

Principio: El proceso de marcado sigue标记-清除算法Lo mismo entonces整理存Los objetos vivos se mueven hacia un extremo y luego todos los objetos fuera del límite vivo清除 . Desventajas: Mover objetos implica cierto riesgo. Demasiados objetos son ineficientes Función: Principalmente en la vejez.

imagen.png

Recolector de basura

El recolector de basura utilizado por GC se utiliza para el reciclaje. Con el desarrollo continuo, hay cada vez más recolectores de basura. Aquí están los recolectores de basura convencionales y se dividen en tres categorías: recolector de subproceso único, recolector de subprocesos múltiples y concurrente. dispositivo de recogida.

Colector de un solo hilo

Las combinaciones de recopiladores de un solo subproceso son: Serial/Serial Old Collector. No solo utilizan un subproceso de recopilación para completar la operación de recopilación, sino que mientras el subproceso de recopilación está funcionando, el subproceso del usuario debe dejar de esperar hasta que se complete la recopilación. La imagen muestra el diagrama esquemático del colector Serial/Serial Old:

imagen.png Si los recursos de memoria del cliente son limitados, la cantidad de núcleos de procesador es pequeña o es un procesador de un solo núcleo, su simplicidad y eficiencia pueden hacer que el recopilador complete su trabajo lo más rápido posible.

Colector paralelo multiproceso

Los recopiladores de subprocesos múltiples incluyen: ParNew, Parallel Scavenge y Parallel Old, entre los cuales Parallel Scavenge/Parallel Old es un recopilador combinado. Estos recolectores de subprocesos múltiples solo agregan subprocesos de recolección de basura y los subprocesos del usuario aún dejan de esperar la recolección de basura.

imagen.png

parNew recopilador: en realidad es una versión multiproceso de Serial. Actualmente puede cooperar con el recopilador Serial y el recopilador CMS.

Recolector Parallel Scavenge: generalmente se usa junto con el recolector Parallel Old.En comparación con parNew Collector, presta más atención a吞吐量control, el rendimiento esEl tiempo de ejecución del hilo del usuario representa el tiempo total de ejecución de la CPU., el rendimiento es, por supuesto, cuanto mayor, mejor.

El subproceso múltiple generalmente utiliza el servidor, porque la ejecución de subprocesos múltiples implica el consumo de tiempo de rotación del segmento de tiempo. Si se trata de un solo procesador, la eficiencia del procesamiento sin duda será más lenta. Pero es muy bueno para los recursos, y el lado del servidor de los cálculos de análisis que no necesita interactuar con el usuario puede aumentar la eficiencia de ejecución.

recopilador concurrente

Los recopiladores concurrentes incluyen: Recolector CMS, que es un recopilador cuyo objetivo es mantener el tiempo de pausa del sistema lo más corto posible y brindar una mejor experiencia de usuario. Su hilo de colección se puede ejecutar al mismo tiempo que el hilo del usuario. CMS tiene tres标记(nota inicial, nota concurrente, observación) y una vez清理(Limpieza concurrente), dos de las tres marcas requieren que se detenga el subproceso de usuario más corto, una marca más larga que es concurrente con el subproceso de usuario y la limpieza que es concurrente con el subproceso de usuario.

imagen.png

marca inicial: Marque el primer objeto asociado con GC Roots, el tiempo es muy corto marcado concurrente: Ejecute la cadena de referencia de GC Roots (algoritmo de análisis de accesibilidad) al mismo tiempo que el hilo del usuario, lo que lleva mucho tiempo. reetiquetar : Vuelva a buscar la nueva cadena de referencia generada por el hilo del usuario durante la fase de marcado concurrente. Un poco más largo que la marca inicial.Borrado concurrente:usar标记-清除算法Limpiar objetos inútiles.

Tres desventajas principales: 1: sensibilidad de la CPU, la concurrencia puede afectar el funcionamiento de los subprocesos del usuario en procesadores con una pequeña cantidad de núcleos. 2: Basura flotante: la basura generada durante la fase de limpieza concurrente solo puede esperar hasta la próxima recolección de GC. Tres: fragmentación de la memoria, limpieza de marcado. Los productos Puja tienen una gran cantidad de espacio de memoria discontinuo.

resumen

Este artículo comienza desde那些内存需要回收什么时候回收如何回收Como implementación, se escriben dos algoritmos de juicio de supervivencia de objetos, condiciones para el reciclaje del área de clase, mecanismo generacional y tiempo de recolección del reciclaje, tres algoritmos de recolección y recolectores de basura de uso común.