César Estrada Yglesias
3 min readNov 6, 2023

--

¿Cómo funciona el garbage collector en java?

En un artículo anterior revisamos lo que era el manejo de memoria y lo importante que era saber como se este gestiona mientras realizamos el desarrollo de nuestras aplicaciones.

El día de hoy revisaremos como es que funciona el garbage collector en Java, revisando cuales son los errores más comunes durante la implementación de nuestras aplicaciones . Explicaremos también brevemente como es que el algoritmo mark-and-sweep (marca y barrido) se ejecuta para liberar espacio en el heap.

Para entender mejor. ¿Cuando es que se ejecuta el garbage collector?

Existen diversas situaciones en las que se ejecuta el garbage collection, una de las más comunes es cuando la máquina virtual se ve imposibilitada de crear un nuevo objeto en el Heap, en caso esto suceda la JVM ejecuta inmediatamente el recolector de basura (GC), finalmente intenta añadir nuevamente el objeto al heap y si aún así es imposible, la JVM lanza la excepción OutOfMemoryError.

Existen diferentes casuísticas de OutOfMemoryError y mencionaremos las más comunes:

  • Java heap space. No se puede agregar otro objeto al heap, no hay memoria suficiente para el nuevo objeto. TODO: Revisar la implementación de tu código, tal vez puedas evitar la creación innecesaria de objetos o realizar procesos a través de batches.
  • GC Overhead limit exceeded. Ocurre cuando el Garbage Collector se ha venido ejecutando durante al menos 5 veces seguidas, y después de cada ejecución menos del 2% de objetos del heap ha sido liberado, lanza la excepción OutOfMemoryError. Tenemos que considerar también que cada vez que el GC se ejecuta, usualmente el sistema pasa a funcionar lentamente, lo que muchas veces dificulta la ejecución normal de la aplicación. Es importante saber que podemos solucionar este problema aumentando el heap space de nuestra aplicación, claro que muchas veces no es la correcta solución a nuestros problemas de memoria pero existen ocasiones donde llega a ser inevitable. Este comportamiento también puede anularse modificando la variable XX:-UseGCOverheadLimit a través de la linea de comandos al ejecutar nuestra aplicación.
  • Requested array size exceeds VM limit. Cuando se intenta crear un array y excede de la capacidad de la JVM.
  • Metaspace. El metaspace en java es quién se encarga de almacenar la metadata de las clases generadas, este espacio no tiene un limite fijo pero si tiene un máximo definido por la variable MaxMetaspaceSize, cuando este máximo es alcanzado se lanza la excepción OutOfMemoryError con el mensaje Metaspace.

Podemos encontrar mayor información en la documentación oficial de Oracle para esta excepción: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html

Ahora veremos como es que funciona el algoritmo de Mark and Sweep

A) Mark

Este proceso se encarga de marcar los objetos que existen en el heap que aún se encuentran referenciados por alguna variable en el stack. Marca a todos aquellos como “vivos” o “en uso”, a los demás los deja sin marca.

¿Cómo realiza este marcado?

Se utilizan los objetos como nodos, y se hace un marcado transversal usando el algoritmo DFS, se marcan todos los objetos que se encuentran en uso y se asume que los restantes no tienen una referencia válida y serán eliminados en el siguiente paso.

B) Sweep

El Garbage Collector itera sobre todos aquellos nodos que no han sido marcados en la primera fase y los elimina del heap space. Ahora esas direcciones de memoria se encontrarán listas para un próximo uso o asignación de algún otro objecto.

Espero haya servido este aporte :)

Muchas gracias

--

--