¿Cómo se libera la memoria en Javascript?

Los algoritmos que aplica Javascript sin que te des cuenta para liberar la memoria y la importancia de ello

hace 2 años   •   3 min de lectura

Por Andrés Tuñón
meme de squid game
Tabla de contenidos

Justo estas semanas resolvía una funcionalidad aplicando una estructura similar a un árbol; este involucraba vinculaciones circulares y la eliminación de objetos.

En otros artículos profundizaré sobre esta estructura, pero por el momento surgío a mi mente la pregunta:

¿Habrá manera de eliminar un objeto de la memoria?

Digamos que yo defino una variable, esa variable hace referencia a un espacio en la memoria. ¿Cómo libero ese espacio?

En C se debe liberar manualmente con malloc y free, pero lenguajes nuevos como C#, Java, Javascript y otros lo hacen automáticamente (bueno no tan nuevos...).

En Javascript, como los otros, tiene un algoritmo llamado "Garbage Collector"; ya lo conocía pero empieza a tener relevancia a grandes escalas.

C como padre de nuevos lenguajes
C como base de nuevos lenguajes

Las variables en memoria

En Javascript, Typescript, CoffeeScript y todo derivado que se te ocurra que transpila a Javascript; terminas declarando variables primitivas y objetos. Incluso si declaras un arreglo, es un objeto con un 'key' numérico.

Las variables primitivas son simples valores, pero las variables con objetos son copias de referencias en la memoria. Cualquier cambio que realizas en un objeto se replica en los objetos 'copia', Javascript no trabaja con referencias, trabaja con copias de referencias (call by sharing).

Incluso en Angular, React y otros puedes apreciar librerías y soluciones utilizando referencias circulares y asignación de objetos, por ejemplo, Reactive Forms (Angular):

Ejemplo del uso de la estrategia con FormGroups y Reactive Forms
Ejemplo del uso de la estrategia con FormGroups y Reactive Forms

Si tu cambias una copia, la memoria aún queda ocupada y aquí entra la importancia del Garbage Collector.

Garbage Collection

Javascript aplica un algoritmo basado en el "Reachability"; es decir, si puedo alcanzar el objeto por alguna referencia; en otras palabras, si nadie te necesita, pues te borro.

Digamos que yo declaro un objeto, se puede alcanzar desde el contexto en el que lo declaraste (obviamente).

Ejemplo #1
Ejemplo #1

Luego si no hay alguna variable u objeto que haga referencia a este objeto se lo lleva el Garbage Collector.

Ejemplo #2
Ejemplo #2

Si deseas profundizar más en el tema, te dejo en las referencias un sitio que lo explica clarísimo (es el primero).

Qué podemos sacar de esto

Si estas trabajando con objetos y relacionandolos entre ellos, con tan solo desvincularlo y dejandolos sueltos se van a eliminar; de hecho no puedes eliminarlos directamente (que yo sepa).

Debes reasignar estos puntos en los que estaba la copia y tener cuidado en no dejar uniones perdidas para evitar memory leaks (desbordamiento de memoria).

Podría tomar esto como otra razón para siempre evitar mutar arreglos y objetos (Functional Programming).

Referencias

Garbage collection
Memory Management - JavaScript | MDN
Low-level languages like C, have manual memory management primitives such as malloc() and free(). In contrast, JavaScript automatically allocates memory when objects are created and frees it when they are not used anymore (garbage collection). This automaticity is a potential source of confusion: it…

Corre la voz

Sigue leyendo