Cómo corregir el «Error de falta de memoria en el montón de JavaScript»

JavaScript sigue siendo uno de los lenguajes de programación más utilizados debido a su versatilidad. Para ejecutar JavaScript fuera de un entorno de navegador, los desarrolladores deben instalar Node.js, un entorno de tiempo de ejecución multiplataforma.

El error de montón de JavaScript sin memoria es común cuando se ejecuta un proyecto JavaScript Node.js.

El problema de la pila de JavaScript sin memoria es un error que ocurre cuando la memoria predeterminada asignada por el sistema informático es insuficiente para ejecutar un gran proyecto.

Si encuentra el error de montón sin memoria, su programa se bloqueará y mostrará esta salida;

ERROR FATAL: CALL_AND_RETRY_LAST Falló la asignación: el montón de JavaScript se quedó sin memoria

O

Error fatal: error en la asignación de tamaño de tabla no válida: el montón de javascript se quedó sin memoria

Causas del montón de JavaScript sin error de memoria

  • Presencia de grandes estructuras de datos: trabajar con grandes estructuras de datos, como matrices o arreglos, puede consumir mucho espacio y, finalmente, provocar un error de memoria insuficiente.

Este es un ejemplo de una gran estructura de datos con mil millones de elementos;

let array = [];

for (let i = 0; i < 1000000000; i++) {

  array.push(i);

}
  • Gestión deficiente de la memoria: a medida que su aplicación crece, debe dejar de lado algunos de los objetos que ya no necesita.

Este es un ejemplo de una función que conduce a una fuga de memoria;

let array = [];

setInterval(function() {

  array.push(new Array(1000000).join("x"));

}, 1000);
  • Bucles infinitos: dicho código se ejecuta para siempre ya que nunca se alcanza una condición de terminación.

Este es un ejemplo de un bucle infinito que se ejecutará para siempre;

while (true) {

    console.log(1);

}

Los bucles infinitos pueden provocar este error, ya que utiliza la memoria bastante rápido.

  • Funciones recursivas: una función recursiva es una función que se llama a sí misma directa o indirectamente para repetir un determinado conjunto de instrucciones hasta que se cumplan determinadas condiciones. Si estas funciones están bien diseñadas, es probable que conduzcan a errores de memoria y, eventualmente, a un montón de errores de memoria.
  • Presencia de muchos objetos en una pieza de código: si su código tiene muchos objetos grandes, la memoria utilizada por esos objetos en conjunto puede provocar una sobrecarga.

Arreglar el montón de JS sin error de memoria

Este error puede ocurrir en Windows, macOS y sistemas operativos basados ​​en Linux como Ubuntu. Afortunadamente, el error se puede reparar, independientemente de su sistema operativo.

#1. Corrección del error de falta de memoria en el montón de JavaScript en el sistema operativo Windows

Paso 1: Haga clic en el menú de inicio y busque Configuración avanzada del sistema.

Paso 2: Haga clic en Variables de entorno en la parte inferior izquierda del cuadro de diálogo.

Paso 3: Haga clic en Nuevo en Variables de usuario o Variables del sistema. La primera opción aplica los cambios a la cuenta de usuario actual. Sin embargo, la segunda opción aplica los cambios a todo el sistema.

Paso 4: Se mostrarán dos opciones; en el nombre de la variable, ingrese NODE_OPTIONS y en el valor de la variable, ingrese –max-old-space-size=4096. En este paso, la cifra 4096 asignará 4 GB de memoria virtual a Node.js. Puede asignar más, como 8 GB, configurando el valor como –max-old-space-size=8192.

Paso 5: Haga clic en Aceptar, Aplicar y, finalmente, Aceptar para guardar los cambios.

También puede usar el terminal de Windows PowerShell para resolver el error. Abra la terminal en su sistema operativo Windows e ingrese el siguiente comando;

env:NODE_OPTIONS="--max-old-space-size=4096"

También puede resolver el error temporalmente ejecutando este comando antes de ejecutar su aplicación;

set NODE_OPTIONS=--max-old-space-size=4096

#2. Arreglando el montón de JavaScript sin error de memoria en Linux

  • Paso 1: Identifique la fuente del error. Verifique los registros de la consola o la salida para determinar las líneas de código/archivo que causan el error.
  • Paso 2: exporte una variable de entorno que especifique la memoria virtual que ha asignado a Node.js. Utilice este comando;
export NODE_OPTIONS=--max-old-space-size=4096

Estos pasos asignarán 4 GB de memoria virtual a Node.js. Si el error persiste, puede aumentar el tamaño de la memoria duplicándolo.

Por ejemplo, si desea asignar 8 GB como memoria virtual, puede ejecutar este comando;

export NODE_OPTIONS=--max-old-space-size=8192

#3. Arreglando el montón de JavaScript sin error de memoria en macOS

Puede resolver el error de falta de memoria del montón de JavaScript en macOS utilizando un enfoque similar al de Linux. Sigue estos pasos;

  • Paso 1: identifique la fuente del error revisando los registros de la consola o la salida para determinar las líneas de código/archivo que causan el error.
  • Paso 2: exporte una variable de entorno que especifique la memoria virtual que ha asignado a Node.js. Utilice este comando;
export NODE_OPTIONS=--max-old-space-size=4096

Estos pasos asignarán 4 GB de memoria virtual a Node.js. Si el error persiste, puede aumentar el tamaño de la memoria duplicándolo.

Por ejemplo, si desea asignar 8 GB como memoria virtual, puede ejecutar este comando;

export NODE_OPTIONS=--max-old-space-size=8192

Aumento de la memoria durante la instalación de NPM

Las soluciones que hemos ofrecido hasta ahora se adaptan a los errores que ocurren cuando ejecuta una aplicación Node.js. Sin embargo, puede asignar memoria virtual para resolver el error de falta de memoria cuando instala paquetes de JavaScript. Utilice este comando;

node --max-old-space-size=4096 (which npm) install

Nota: Puede seguir aumentando la asignación de memoria virtual en 1 GB, 2 GB, 3 GB o 4 GB. Debe especificar el tamaño de la memoria en MB. Sin embargo, no asigne toda la memoria de la máquina a Node.js, ya que esto puede hacer que su programa se bloquee. Como buena práctica, si su máquina tiene 16 GB, puede asignar hasta 8 GB a Node.js.

Prevenga el error JavaScript the heap out of memory

Hasta ahora hemos discutido cómo corregir el error de falta de memoria del montón de JavaScript cuando ocurre. Afortunadamente, también puede tener medidas para evitar que ocurra este error mientras ejecuta el código JavaScript. Estos son algunos de los mejores enfoques:

#1. Divida los datos en pequeños fragmentos

Es posible que tenga un programa Node.js que importe grandes conjuntos de datos desde archivos CSV grandes a través del proceso ETL: Extraer – Transformar – Cargar. Es posible que su aplicación siempre se bloquee cuando intenta importar los datos. Si está trabajando con MongoDB, puede resolver el error al tener una instrucción de línea de comando como;

split -l 1000000 users.csv

Este comando le indica a Node.js que divida un archivo llamado usuarios en varios archivos con 1000000 usuarios cada uno. El indicador -l especifica que el archivo debe dividirse según el número de líneas de código.

#2. Supervisar el uso de la memoria

Puede usar un generador de perfiles de memoria para detectar fugas de memoria en su código. Puede combinar la memoria incorporada de Node.js y ChromeDevTools para lograrlo. Los dos pueden detectar problemas en su código y solucionarlos.

También puede usar herramientas externas como Datadog, New Relic y AppDynamics para monitorear el rendimiento de su aplicación y tomar las medidas necesarias. También puede verificar el uso de la memoria en su aplicación Node.js a través del método process.memoryUsage().

#3. Evitar fugas de memoria

Las fugas de memoria ocurren cuando su aplicación Node.js conserva referencias a objetos que ya no necesita. Si dichos objetos no se recolectan como elementos no utilizados, se acumulará el uso de la memoria con el tiempo.

Existen varios enfoques para evitar fugas de memoria, como evitar variables globales en su código, evitar bloquear operaciones de E/S y usar las palabras clave let y const al declarar sus variables en lugar de var.

#4. Procesos de desove

Si está ejecutando Node.js en una máquina con memoria limitada, como Raspberry Pi, es probable que se encuentre con errores de memoria. Puede tener un proceso maestro y otros se agrupan como trabajadores. Tan pronto como el proceso maestro detecte que el sistema se está quedando sin memoria, eliminará ese proceso y asignará la tarea a otro que no esté sobrecargado.

#5. Actualizar hardware

Si aumentar la asignación de memoria y llevar a cabo los procesos enumerados para evitar el error de almacenamiento en memoria no resuelve sus problemas, entonces puede considerar actualizar su hardware. Node.js puede ejecutarse en RAM de tan solo 512 MB. Sin embargo, su aplicación exigirá más RAM a medida que crezca.

Por otro lado, aumentar la cantidad de CPU también puede mejorar la asignación de memoria. Idealmente, 2 o más CPU permitirán que su aplicación use subprocesos de trabajo para tareas intensivas de CPU, como criptografía y procesamiento de imágenes.

preguntas frecuentes

¿Qué causa el error JavaScript Heap Out of Memory?

Este error puede deberse a varias razones;
1. Fugas de memoria
2. Bucles infinitos
3. Presencia de muchos objetos en un proyecto
4. Presencia de grandes estructuras de datos

¿Se puede resolver el error JavaScript Heap Out of Memory?

Sí. Puede resolver el error a través de;
1. Asignar más memoria virtual a Node.js
2. Eliminar pérdidas de memoria
3. Optimizando tu código
4. Actualizar su hardware

¿Cómo puede resolver el error Heap Out of Memory en la aplicación React?

React es una de las bibliotecas de JavaScript más populares. Localice el archivo package.json en el directorio raíz y estas líneas en la sección de scripts;

"scripts": {

    "start": "react-scripts --max_old_space_size=4096 start",

    "build": "react-scripts --max_old_space_size=4096 build",

    "test": "react-scripts test",

    "eject": "react-scripts eject"

}

Terminando

La mayoría de los desarrolladores están acostumbrados a errores y errores de código, no errores de tiempo de ejecución, mientras ejecutan sus programas Node.js. Por suerte, no tienes que preocuparte, ya que el error de montón sin memoria se puede arreglar. Hemos definido qué es el error de falta de memoria en el montón de JavaScript, explicamos cómo resolverlo y cómo evitarlo en su próximo proyecto de Node.js.

A continuación, también puede leer cómo evitar algunos errores comunes de JavaScript.