Gestión de Perdida o Fuga de Memoria en Node JS – Parte 1

4 minuto(s)

En el desarrollo de un proyecto muchas veces se pueden producir fugas o perdidas de memoria, los lenguajes de alto nivel como JavaScript (Node JS) no está exento de estas fugas de memoria, a veces no nos enfocamos en ciertos detalles que hacen que las produzcamos, por eso en este Post te compartiré varios aspectos debes tomar en consideración para evitar las perdidas o fugas de memoria en Node JS.

Partes

Asimismo te invito a escuchar el Podcast: “5 Consejos para ser un Programador más Productivo” (No son los clásicos consejos técnicos de programación, si no de rutinas y buenos hábitos cotidianos):

Spotify:

Sound Cloud:

Bien ahora continuemos con el Post: Gestión de Perdida o Fuga de Memoria en Node JS – Parte 1.

Las fugas o pérdidas de memoria se pueden definir de manera general como un bloque de memoria que se encuentra en una aplicación, pero ya no es requerido por la aplicación. Veamos a continuación varios aspectos importantes para mantener un optimo rendimiento de la memoria en Node JS.

Gestión de Memoria

Parte de la gestión de la memoria es asignar memoria de la memoria del computador y luego liberar esa memoria cuando ya no este en uso. Hay diferentes formas de administrar la memoria y depende del Lenguaje de Programación que se este utilizando. A continuación te mostraré algunas formas de administrar o gestionar la memoria:

Gestión manual de Memoria

En este paradigma de gestión de memoria, el desarrollador es responsable de asignar y luego liberar la memoria. El Lenguaje por defecto no proporciona ninguna herramienta automatizada que haga esto por nosotros. Si bien brinda una flexibilidad extrema, también es una sobrecarga adiciona. Los Lenguajes de Programación C y C++ usan este enfoque para administrar la memoria y proporcionar métodos como malloc y free para gestionar la memoria del PC.

Recolección de basura del Lenguaje

Hay Lenguajes de Programación que cuentan con recolectores de basura, los cuales gestionan la memoria de forma inmediata. El desarrollador no necesita preocuparse por liberar memoria, ya que el recolectores de basura lo hará. La mayoría de Lenguajes de Programación modernos como JavaScript, Java, Scala, Kotlin, Golang, Python, Ruby, etc. tienen recolectores de basura incorporado.

Propiedad

En este enfoque de gestión de memoria, cada variable debe tener su propietario y tan pronto como el propietario salga de su alcance, el valor de la variable se eliminará, liberado memoria. El Lenguaje de Programación Rust utiliza este enfoque de gestión de memoria.

Hay muchas otras formas de Gestionar la memoria, por ejemplo C++11 utiliza RAII y  Swift usa ARC.

Garbage Collection (Recolección de basura) en Javascript

Como mencione anteriormente, JavaScript es un Lenguaje de Programación que tiene un recolector de basura, este motor se llama Garbage Collector, el cual se ejecuta periódicamente y comprueba que memoria asignada aún puede alcanzar el código de una aplicación, es decir, qué variables todavía tienen referencia.

Si el motor encuentra que la memoria no hace referencia a alguna memoria, la liberará. Hay 2 algoritmos que usa este motor el primer es Mark and Sweep que es usado por JavaScript y el otro es Reference Counting (Conteo de referencias) el cual es usado por Python y PHP

El algoritmo Mark and Sweep primero crea una lista de roots que son variables globales en el entorno del objeto window en el navegador y luego atraviesa el árbol desde los roots hasta los nodos y marca todos los objetos que encuentra. Cualquier memoria no utilizada por los objetos se marca como libre.

Fugas de Memoria en una Aplicación Node JS

Bueno hasta aquí ya conocimos suficientes conceptos sobre fugas de memoria y recolección de basura, con esto ya podemos crear una aplicación Node JS, a la cual le identificaré la fuga de memoria usando diferentes herramientas y luego pasaré a repararla.

No voy a enfocarme en como crear un proyecto nuevo con Node JS. Yo ya he creado un proyecto y un archivo llamado app.js y dentro de este archivo agrego la siguiente aplicación para saturar mi servidor.


Puedes ver en el código anterior, tengo un array llamado leaks el cual esta fuera del alcance de mi aplicación y por lo tanto cada vez que se llama, seguirá enviando datos a ese array sin ser limpiado, el Garbage Collection (Recolección de basura) nunca liberará a memoria que que se consume del PC.

Bueno hasta aquí llegamos con esta primera parte en donde hemos visto conceptos iniciales sobre la gestión de memoria y la recolección de basura y la siguiente parte y última continuaremos.

Ten Paciencia, lo que quiero es que entiendas todo el proceso de como gestionar la memoria en Node JS y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje. 

Nota(s)

  • El código y conceptos mostrados en este Post, puede ser modificados, quedar obsoletos o continuar vigentes, esto no depende de mí, si no de los Desarrolladores que dan soporte a JavaScript.
  • No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.

 

Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.