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 ejecución multiplataforma.

El error JavaScript heap out of memory es común cuando se ejecuta un proyecto JavaScript Node.js.

El problema de memoria insuficiente (heap out of memory) de JavaScript es un error que se produce cuando la memoria asignada por defecto por el sistema informático es insuficiente para ejecutar un gran proyecto.

Si se encuentra con el error heap out of memory, su programa se bloqueará y mostrará esta salida;

ERROR FATAL: CALL_AND_RETRY_LAST Asignación fallida - JavaScript heap out of memory

O

FATAL ERROR: invalid table size allocation failed - javascript heap out of memory

Causas del error JavaScript heap out of memory

  • Presencia de grandes estructuras de datos: Trabajar con grandes estructuras de datos, como matrices o arrays, puede consumir mucho espacio, provocando finalmente un error de memoria insuficiente (heap out of memory).

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);

}
  • Mala gestión de la memoria: A medida que su aplicación crece, necesita desprenderse de algunos de los objetos que ya no necesita.

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

let array = [];

setInterval(function() {

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

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

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

while (true) {

    console.log(1);

}

Los bucles infinitos pueden provocar este error, ya que consumen memoria muy rápidamente.

  • Funciones recursivas: Una función recursiva es una función que se llama a sí misma indirecta o directamente para repetir un/ cierto conjunto de instrucción/es hasta que se cumpla una/ ciertas condición/es. Si estas funciones están bien diseñadas, es probable que conduzcan a un error de memoria y, finalmente, a un error de montón de memoria.
  • Presencia de muchos objetos en un fragmento 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 error JS heap out of memory

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

#1. Arreglar el error JavaScript heap out of memory en SO Windows

Paso1: Haga clic en el menú Inicio y localice Configuración avanzada del sistema.

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

1-3

Paso3: Pulse Nuevo en Variables de usuario o Variables de 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.

2-2

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

3-1

Paso 5: Pulse ok, aplicar y finalmente, ok para guardar los cambios.

También puede utilizar el terminal Windows PowerShell para solucionar el error. Abra el terminal en su sistema operativo Windows e introduzca el siguiente comando;

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

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

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

#2. Arreglar el error de memoria insuficiente (heap out of memory) de JavaScript en Linux

  • Paso 1: Identifique el origen del error. Compruebe los registros o la salida de la consola para determinar las líneas de código/archivo que causan el error.
  • Paso2 : Exporte una variable de entorno especificando la memoria virtual que ha asignado a Node.js. Utilice este comando
export NODE_OPTIONS=-tamaño-máximo-del-espacio-viejo=4096
image-213

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

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

export NODE_OPTIONS=-tamaño-máximo-del-espacio-viejo=8192

#3. Solucionar el error JavaScript heap out of memory en macOS

Puede solucionar el error JavaScript heap out of memory en macOS utilizando un enfoque similar al de Linux. Siga estos pasos;

  • Paso1 : Identifique el origen del error comprobando los registros o la salida de la consola para determinar las líneas de código/archivo que causan el error.
  • Paso2 : Exporte una variable de entorno que especifique la memoria virtual que ha asignado a Node.js. Utilice este comando
export NODE_OPTIONS=-tamaño-máximo-del-espacio-viejo=4096

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

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

export NODE_OPTIONS=-tamaño-máximo-del-espacio-antiguo=8192

Aumentar la memoria durante la instalación de NPM

Las soluciones que hemos ofrecido hasta ahora se adaptan a los errores que se producen al ejecutar una aplicación Node.js. Sin embargo, puede asignar memoria virtual para solucionar el error de memoria insuficiente (heap out of memory) mientras instala paquetes JavaScript. Utilice este comando

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

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

Prevenir en JavaScript el error de memoria insuficiente (heap out of memory)

Hasta ahora hemos hablado de cómo solucionar el error de JavaScript el montón fuera de memoria cuando se produce. Por suerte, también puede tomar medidas para evitar que se produzca este error al ejecutar código JavaScript. Estos son algunos de los mejores enfoques:

#1. Divida los datos en trozos pequeños

Puede que tenga un programa Node.js que importa grandes conjuntos de datos desde grandes archivos CSV a través del proceso ETL: Extraer – Transformar – Cargar. Puede encontrarse con que su aplicación siempre se bloquea cuando intenta importar los datos. Si está trabajando con MongoDB, puede solucionar el error mediante una instrucción de línea de comandos como

split -l 1000000 usuarios.csv

Esta instrucción ordena a Node.js que divida un archivo llamado usuarios en varios archivos con 1000000 usuarios cada uno. La bandera - l especifica que el archivo debe dividirse en función del número de líneas de código.

#2. Monitorizar el uso de memoria

Puede utilizar un perfilador de memoria para detectar fugas de memoria en su código. Puede combinar la memoria incorporada de Node.js y las ChromeDevTools para conseguirlo. Ambos pueden detectar problemas en su código y solucionarlos.

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

#3. Evitar las fugas de memoria

Las fugas de memoria se producen cuando su aplicación Node.js conserva referencias a objetos que ya no necesita. Si dichos objetos no se recogen de la basura, se producirá una acumulación de uso de memoria con el tiempo.

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

#4. Desove de procesos

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

#5. Actualizar el hardware

Si aumentar la asignación de memoria y llevar a cabo los procesos enumerados de prevención de errores de memoria insuficiente (heap out of memory) no resuelven sus problemas, entonces puede considerar actualizar su hardware. Node.js puede funcionar con una RAM tan baja como 512MB. Sin embargo, su aplicación demandará más RAM a medida que crezca.

Por otro lado, aumentar el número de CPU también puede mejorar la asignación de memoria. Idealmente, 2 o más CPU permitirán a su aplicación utilizar hilos de trabajo para tareas intensivas de CPU como la criptografía y el 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 Bucles infinitos
3. Presencia de muchos objetos en un proyecto
4. Presencia de grandes estructuras de datos

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

Sí. Puede solucionar el error mediante;
1. Asignando más memoria virtual a Node.js
2. Eliminando fugas de memoria. Eliminando las fugas de memoria
3. Optimizando su código
4. Actualizando su hardware

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

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

"scripts": {

    "inicio": "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"

}

Recapitulando

La mayoría de los desarrolladores están acostumbrados a bugs y errores de código, no a errores en tiempo de ejecución, cuando ejecutan sus programas Node.js. Por suerte, usted no tiene que preocuparse, ya que el error heap out of memory es solucionable. Hemos definido qué es el error JavaScript heap out of memory, explicado cómo solucionarlo y cómo evitarlo en su próximo proyecto Node.js.

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