Básicos de la recolección de basura de JVM

Algoritmos de los recolectores de basura

Los recolectores de basura suelen tener los siguientes objetivos (más fácil de decir que de hacer)

  • Pausas muy cortas de «parar el mundo» con un objetivo de unos pocos milisegundos
  • Los tiempos de pausa no aumentan con un heap, live-set, o root-set size
  • Para manejar tamaños de heap que van desde unos pocos MBs hasta muchos TBs
  • Alta concurrencia – Todo el trabajo pesado se realiza mientras los hilos de Java continúan ejecutándose
  • Alto rendimiento
  • Fácil de ajustar

Colectores de basura

Los datos del montón se dividen en múltiples regiones de asignación (o generaciones) que se mantienen separadas en función de la edad del objeto (es decir.es decir, el número de iteraciones de GC que han sobrevivido). Mientras que algunos recolectores son uni-generacionales, los otros utilizan dos generaciones: (1) la Generación Joven (dividida a su vez en Edén y dos regiones de Supervivencia) y (2) la Generación Vieja (o de Permanencia).
Fuente: Blog de Ionut Balosin

Dos recolectores generacionales:

Serial GC – El algoritmo utiliza un solo hilo para realizar todo el trabajo de recolección de basura, lo que lo hace relativamente eficiente porque no hay sobrecarga de comunicación entre hilos. Es el más adecuado para máquinas de un solo procesador porque no puede aprovechar el hardware multiprocesador.

CG de rendimiento (paralelo) – Este algoritmo utiliza mark-copy en la Generación Joven y mark-sweep-compact en la Generación Vieja. Ambos recolectores, el Joven y el Antiguo, desencadenan eventos de parada del mundo, deteniendo todos los hilos de la aplicación para realizar la recolección de basura. Ambos recolectores ejecutan las fases de marcado y copia/compactación utilizando múltiples hilos, de ahí el nombre «Paralelo».

El Recolector de Basura Paralelo es adecuado para máquinas multinúcleo en los casos en que su objetivo principal es aumentar el rendimiento. Se consigue un mayor rendimiento gracias a un uso más eficiente de los recursos del sistema:

  • Durante la recolección, todos los núcleos limpian la basura en paralelo, lo que da lugar a pausas más cortas
  • entre los ciclos de recolección de basura ninguno de los recolectores está consumiendo recursos

Garbage First (G1) GC – Este recolector es un recolector de basura de estilo servidor, dirigido a máquinas multiprocesadoras con grandes memorias. Cumple con los objetivos de tiempo de pausa de la recolección de basura (GC) con una alta probabilidad, a la vez que logra un alto rendimiento.

  • El recolector G1 adopta un enfoque diferente en cuanto al modelo de memoria del montón. El montón se divide en un conjunto de regiones de montón de igual tamaño, cada una de las cuales es un rango contiguo de memoria virtual.
  • Ciertos conjuntos de regiones tienen asignados los mismos roles (eden, survivor, old) que en los colectores más antiguos, pero no hay un tamaño fijo para ellos.
  • El tamaño de las regiones lo elige la JVM al iniciarse. La JVM generalmente tiene como objetivo alrededor de 2000 regiones que varían en tamaño de 1 a 32Mb. El colector G1 adopta un enfoque diferente

Para más detalles, consulte Introducción al G1 GC

G1 Heap Allocation

Una generación de colectores:

Shenandoah GC – Shenandoah es el recolector de basura de bajo tiempo de pausa que reduce los tiempos de pausa de GC realizando más trabajo de recolección de basura concurrentemente con el programa Java en ejecución. Shenandoah realiza la mayor parte del trabajo de GC de forma concurrente, incluyendo la compactación concurrente, lo que significa que sus tiempos de pausa ya no son directamente proporcionales al tamaño del montón. La recolección de basura de un montón de 200 GB o de un montón de 2 GB debería tener un comportamiento similar de pausa baja.

Para más detalles, consulte Detalles de implementación en la Wiki

Z GC – ZGC es un recolector de compactación concurrente, de una sola generación, basado en regiones y consciente de NUMA. Las fases de parada del mundo se limitan a la exploración de la raíz, por lo que los tiempos de pausa de GC no aumentan con el tamaño del montón o del conjunto vivo.

Para más detalles, consulte la Sesión sobre ZGC por Per Liden en YouTube

Finalmente,

Epsilon GC (experimental)- Un GC que maneja la asignación de memoria pero no implementa ningún mecanismo de recuperación de memoria real. Una vez que el heap de Java disponible se agota, la JVM se apaga. Diseñado para pruebas internas del JDK pero puede ser útil en dos situaciones

  • Programas de muy corta duración
  • Los programas se escriben cuidadosamente para reutilizar la memoria y nunca realizar nuevas asignaciones

Deja una respuesta

Tu dirección de correo electrónico no será publicada.