Una de las principales funcionalidades de un sistema de ejecución de programas para computadora es la gestión de memoria; dentro de este ámbito se encuentra también el proceso de recolección de desechos, es decir, la liberación de memoria utilizada por recursos que ya no se necesitan.

En este artículo damos un vistazo a estos procesos para programas JavaScript.

Como lenguaje de alto nivel que es, JavaScript no necesita que el programador gestione de forma directa la asignación de memoria; esto es realizado de forma automática por el interprete de JavaScript en tiempo de ejecución (NodeJS o los motores de JavaScript implementados en los diversos navegadores de Internet)

Para la liberación automática de espacios de memoria, JavaScript implementa un proceso automatizado de «recolección de desechos» (GC – Garbage Collection) el cual consiste en monitorear las referencias del programa a espacios de memoria; cuando un espacio de memoria se queda sin referencias, es decir se vuelve inaccesible al programa, este proceso lo reclama como desecho y libera el espacio para ser usado luego.

Por ejemplo, consideremos el siguiente programa sencillo:

let miObjeto= {
   variable: "Mi bello objeto"
}; // En este punto, se ha designado un espacio de memoria para miObjeto, y en particular para el atributo "variable"

console.log(miObjeto.variable);

miObjeto = null; //En este punto, la referencia de miObjeto ha cambiado y ahora apunta a null. Por lo que la propiedad "variable" ya no es accesible en el programa.

console.log(miObjeto.variable);

Tal y como se explica en los comentarios del programa anterior, se define una referencia llamada «miObjeto» que refiere a una propiedad llamada «variable».

Vemos que en la línea 5 podemos referenciar a la propiedad variable y mostrarla en la consola.

En la línea 7 sin embargo cambiamos la referencia de miObjeto para que apunte a null. De esta forma ya la propiedad variable no puede ser accesada desde el programa, lo que hace que la llamada de consola de la línea 9 falle.

Para conseguir esto, la especificación de JavaScript implementa un algoritmo denominado «Mark and Sweep» que identifica qué valores tienen referencias en el programa y las marca para ser preservadas. Aquellos valores que no tengan referencias (que no han sido marcadas) son luego eliminadas (sweep).

Nótese que todos los navegadores modernos usan el algoritmo «Mark and Sweep». Navegadores más antiguos solían tener problemas de «fugas de memoria» para objetos que presentaban referencias circulares.

Un ejemplo de referencia circular es cuando hay una referencia en un objeto «A» a un objeto «B» e igualmente hay una referencia en el objeto «B» al objeto «A»

let objetoA = {referencia: null};
let objetoB = {referencia: objetoA};
objetoA.referencia: objetoB;

 7,723 total views,  1 views today

0Shares
Última modificación: mayo 19, 2022

Autor

Comentarios

Escribe una respuesta o comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.