preloader

Recolección de basura

La administración de memoria en JavaScript opera de manera automática e invisible para los desarrolladores. Cuando creamos datos como primitivos, objetos o funciones, estos consumen memoria dinámica.

¿Qué ocurre cuando un objeto ya no es necesario? ¿Cómo gestiona el motor de JavaScript su eliminación?

Alcance de la Memoria

El concepto fundamental en la gestión de memoria es el «alcance». Los valores «alcanzables» son aquellos que pueden ser accedidos o utilizados de alguna forma. Estos valores son conservados en la memoria.

Existen valores raíz que son inherentemente accesibles y no pueden ser eliminados. Por ejemplo:

  • Las variables locales y parámetros de la función actualmente en ejecución.
  • Otras funciones en la cadena actual de llamadas anidadas, junto con sus variables y parámetros.
  • Variables globales y otros internos del entorno de ejecución.

Recolección de Basura

JavaScript utiliza un proceso denominado «recolección de basura» para eliminar los objetos que se han vuelto inaccesibles.

Ejemplo Simple

				
					// `usuario` tiene una referencia al objeto
let usuario = {
  nombre: "Juan"
};

// La referencia a `usuario` se elimina
usuario = null;

// El objeto {nombre: "Juan"} se vuelve inalcanzable y será eliminado

				
			

Dos Referencias

				
					// `usuario` tiene una referencia al objeto
let usuario = {
  nombre: "Juan"
};

// `admin` ahora también tiene una referencia al mismo objeto
let admin = usuario;

// Si `usuario` se vuelve inalcanzable
usuario = null;

// El objeto sigue siendo accesible a través de `admin`

				
			

Objetos Entrelazados

				
					function casar(hombre, mujer) {
  mujer.esposo = hombre;
  hombre.esposa = mujer;

  return {
    padre: hombre,
    madre: mujer
  }
}

let familia = casar({
  nombre: "Juan"
}, {
  nombre: "Ana"
});

// Eliminación de las referencias
delete familia.padre;
delete familia.madre.esposo;

// El objeto `Juan` se vuelve inalcanzable y será eliminado

				
			

Algoritmos Internos

El algoritmo básico de recolección de basura es conocido como «marcar y barrer»:

  1. El recolector de basura marca los valores raíz.
  2. Luego, marca todos los objetos alcanzables desde estos valores raíz.
  3. Finalmente, elimina los objetos que no fueron marcados durante este proceso.

Optimizaciones

Los motores modernos de JavaScript implementan técnicas avanzadas para optimizar la recolección de basura:

  • Recolección Generacional: Divide los objetos en categorías «nuevos» y «antiguos», gestionando cada categoría de manera diferente.
  • Recolección Incremental: Divide el proceso de recolección en partes más pequeñas para minimizar el impacto en la ejecución del código.
  • Recolección en Tiempo Inactivo: Ejecuta la recolección de basura cuando la CPU está inactiva para reducir la interferencia con el rendimiento del programa.

Estas optimizaciones aseguran que el recolector de basura funcione eficientemente sin causar retrasos significativos en la ejecución del código.

Conclusión

Entender cómo funciona la recolección de basura en JavaScript es crucial para escribir código eficiente y optimizado. Si bien los detalles pueden variar entre motores de JavaScript, comprender los conceptos básicos te permitirá manejar mejor la gestión de memoria en tus aplicaciones.

Related Post

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *