Come risolvere “Errore di memoria esaurita dell’heap JavaScript”

JavaScript rimane uno dei linguaggi di programmazione più utilizzati grazie alla sua versatilità. Per eseguire JavaScript al di fuori di un ambiente browser, gli sviluppatori devono installare Node.js, un ambiente di runtime multipiattaforma.

L’errore di memoria esaurita dell’heap JavaScript è comune durante l’esecuzione di un progetto JavaScript Node.js.

Il problema di memoria esaurita dell’heap JavaScript è un errore che si verifica quando la memoria predefinita allocata dal sistema informatico non è sufficiente per eseguire un grande progetto.

Se incontri l’errore heap out of memory, il tuo programma andrà in crash e visualizzerà questo output;

ERRORE IRREVERSIBILE: allocazione CALL_AND_RETRY_LAST non riuscita: memoria heap JavaScript esaurita

O

Errore irreversibile: allocazione della dimensione della tabella non valida non riuscita: memoria heap javascript esaurita

Cause dell’errore di memoria esaurita dell’heap JavaScript

  • Presenza di strutture di dati di grandi dimensioni: lavorare con strutture di dati di grandi dimensioni come matrici o array può consumare molto spazio, causando alla fine un errore di heap out of memory.

Questo è un esempio di una grande struttura dati con un miliardo di elementi;

let array = [];

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

  array.push(i);

}
  • Cattiva gestione della memoria: man mano che la tua applicazione cresce, devi lasciare andare alcuni degli oggetti che non ti servono più.

Questo è un esempio di una funzione che porta alla perdita di memoria;

let array = [];

setInterval(function() {

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

}, 1000);
  • Cicli infiniti: tale codice viene eseguito per sempre poiché una condizione di terminazione non viene mai raggiunta.

Questo è un esempio di un ciclo infinito che verrà eseguito per sempre;

while (true) {

    console.log(1);

}

I cicli infiniti possono portare a questo errore poiché utilizza la memoria abbastanza velocemente.

  • Funzioni ricorsive: una funzione ricorsiva è una funzione che chiama se stessa indirettamente o direttamente per ripetere un determinato insieme di istruzioni fino a quando una determinata condizione non viene soddisfatta. Se queste funzioni sono ben progettate, probabilmente porteranno a errori di memoria e, infine, a un mucchio di errori di memoria.
  • Presenza di molti oggetti in un pezzo di codice: se il tuo codice ha molti oggetti di grandi dimensioni, la memoria utilizzata da quegli oggetti collettivamente può portare a un sovraccarico.

Risolto l’errore di memoria esaurita dell’heap JS

Questo errore può verificarsi in Windows, macOS e sistemi operativi basati su Linux come Ubuntu. Fortunatamente, l’errore è risolvibile, indipendentemente dal tuo sistema operativo.

#1. Correzione dell’errore di memoria esaurita dell’heap JavaScript sul sistema operativo Windows

Passaggio 1: fare clic sul menu Start e individuare Impostazioni di sistema avanzate.

Passaggio 2: fare clic su Variabili d’ambiente nella parte in basso a sinistra della finestra di dialogo.

Passaggio 3: fare clic su Nuovo su Variabili utente o Variabili di sistema. La prima opzione applica le modifiche all’account utente corrente. Tuttavia, la seconda opzione applica le modifiche all’intero sistema.

Passaggio 4: verranno visualizzate due opzioni; sul nome della variabile, inserisci NODE_OPTIONS e sul valore della variabile, inserisci –max-old-space-size=4096. In questo passaggio, la cifra 4096 assegnerà 4 GB di memoria virtuale a Node.js. Puoi allocare di più, ad esempio 8 GB, impostando il valore come –max-old-space-size=8192.

Passaggio 5: fare clic su ok, applica e infine su ok per salvare le modifiche.

Puoi anche utilizzare il terminale di Windows PowerShell per risolvere l’errore. Apri il terminale sul tuo sistema operativo Windows e inserisci il seguente comando;

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

Puoi anche risolvere temporaneamente l’errore eseguendo questo comando prima di eseguire la tua app;

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

#2. Correzione dell’errore di memoria esaurita dell’heap JavaScript su Linux

  • Passaggio 1: identificare la fonte dell’errore. Controllare i log o l’output della console per determinare le righe di codice/file che causano l’errore.
  • Passaggio 2: esporta una variabile di ambiente specificando la memoria virtuale allocata a Node.js. Usa questo comando;
export NODE_OPTIONS=--max-old-space-size=4096

Questi passaggi assegneranno 4 GB di memoria virtuale a Node.js. Se l’errore persiste, puoi aumentare la dimensione della memoria raddoppiandola.

Ad esempio, se desideri allocare 8 GB come memoria virtuale, puoi eseguire questo comando;

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

#3. Correzione dell’errore di memoria esaurita dell’heap JavaScript su macOS

Puoi risolvere l’errore di memoria esaurita dell’heap JavaScript in macOS utilizzando un approccio simile a quello di Linux. Segui questi passi;

  • Passaggio 1: identificare l’origine dell’errore controllando i log o l’output della console per determinare le righe di codice/file che causano l’errore.
  • Passaggio 2: esporta una variabile di ambiente specificando la memoria virtuale allocata a Node.js. Usa questo comando;
export NODE_OPTIONS=--max-old-space-size=4096

Questi passaggi assegneranno 4 GB di memoria virtuale a Node.js. Se l’errore persiste, puoi aumentare la dimensione della memoria raddoppiandola.

Ad esempio, se desideri allocare 8 GB come memoria virtuale, puoi eseguire questo comando;

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

Aumento della memoria durante l’installazione di NPM

Le soluzioni che abbiamo offerto finora sono adatte agli errori che si verificano quando esegui un’applicazione Node.js. Tuttavia, è possibile allocare memoria virtuale per risolvere l’errore di memoria esaurita durante l’installazione dei pacchetti JavaScript. Usa questo comando;

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

Nota: puoi continuare ad aumentare l’allocazione della memoria virtuale di 1 GB, 2 GB, 3 GB o 4 GB. È necessario specificare la dimensione della memoria in MB. Tuttavia, non allocare l’intera memoria della macchina a Node.js poiché ciò potrebbe causare l’arresto anomalo del programma. Come buona pratica, se la tua macchina ha 16 GB, puoi allocare fino a 8 GB a Node.js.

Impedisci a JavaScript l’heap con errore di memoria

Finora abbiamo discusso su come correggere l’errore di memoria esaurita dell’heap JavaScript quando si verifica. Fortunatamente, puoi anche disporre di misure per evitare che questo errore si verifichi durante l’esecuzione del codice JavaScript. Questi sono alcuni dei migliori approcci:

#1. Dividi i dati in piccoli blocchi

Potresti avere un programma Node.js che importa set di dati di grandi dimensioni da file CSV di grandi dimensioni tramite il processo ETL: Estrazione – Trasformazione – Caricamento. Potresti scoprire che la tua app si arresta sempre in modo anomalo quando provi a importare i dati. Se stai lavorando con MongoDB, puoi risolvere l’errore con un’istruzione da riga di comando come;

split -l 1000000 users.csv

Questo comando indica a Node.js di dividere un file denominato users in più file con 1000000 utenti ciascuno. Il flag -l specifica che il file deve essere suddiviso in base al numero di righe di codice.

#2. Monitorare l’utilizzo della memoria

È possibile utilizzare un profiler di memoria per rilevare perdite di memoria nel codice. Puoi combinare la memoria integrata di Node.js e ChromeDevTools per raggiungere questo obiettivo. I due possono rilevare problemi nel tuo codice e risolverli.

Puoi anche utilizzare strumenti esterni come Datadog, New Relic e AppDynamics per monitorare le prestazioni della tua app e intraprendere le azioni necessarie. Puoi anche controllare l’utilizzo della memoria sulla tua app Node.js tramite il metodo process.memoryUsage().

#3. Evitare perdite di memoria

Le perdite di memoria si verificano quando l’app Node.js conserva riferimenti a oggetti di cui non ha più bisogno. Se tali oggetti non vengono sottoposti a Garbage Collection, nel tempo si verificherà un aumento dell’utilizzo della memoria.

Esistono diversi approcci per evitare perdite di memoria, come evitare le variabili globali nel codice, evitare il blocco delle operazioni di I/O e utilizzare le parole chiave let e const quando si dichiarano le variabili invece di var.

#4. Processi riproduttivi

Se stai eseguendo Node.js su una macchina con memoria limitata, come Raspberry Pi, è probabile che si verifichino errori di memoria esaurita. Puoi avere un processo principale e altri sono raggruppati come lavoratori. Non appena il processo master rileva che il sistema sta esaurendo la memoria, interromperà quel processo e assegnerà l’attività a un altro che non è sovraccarico.

#5. Aggiorna l’hardware

Se l’aumento dell’allocazione della memoria e l’esecuzione dei processi elencati per impedire l’errore di heap out of memory non risolvono i problemi, è possibile prendere in considerazione l’aggiornamento dell’hardware. Node.js può essere eseguito su RAM fino a 512 MB. Tuttavia, la tua app richiederà più RAM man mano che cresce.

D’altra parte, l’aumento del numero di CPU può anche migliorare l’allocazione della memoria. Idealmente, 2 o più CPU consentiranno all’applicazione di utilizzare i thread di lavoro per attività a uso intensivo della CPU come la crittografia e l’elaborazione delle immagini.

Domande frequenti

Che cosa causa l’errore di memoria esaurita dell’heap JavaScript?

Questo errore può essere causato da diversi motivi;
1. Perdite di memoria
2. Cicli infiniti
3. Presenza di molti oggetti in un progetto
4. Presenza di grandi strutture dati

L’errore JavaScript Heap Out of Memory è risolvibile?

SÌ. Puoi risolvere l’errore attraverso;
1. Assegnare più memoria virtuale a Node.js
2. Eliminazione delle perdite di memoria
3. Ottimizzazione del codice
4. Aggiornamento dell’hardware

Come puoi risolvere l’errore Heap Out of Memory nell’app React?

React è una delle librerie JavaScript più popolari. Individua il file package.json nella directory principale e queste righe nella sezione degli script;

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

}

Avvolgendo

La maggior parte degli sviluppatori è abituata a bug ed errori di codice, non errori di runtime, mentre eseguono i loro programmi Node.js. Fortunatamente, non devi preoccuparti, poiché l’errore di heap out of memory è risolvibile. Abbiamo definito cos’è l’errore di memoria esaurita dell’heap JavaScript, spiegato come risolverlo e come evitarlo nel tuo prossimo progetto Node.js.

Successivamente, puoi anche leggere come evitare alcuni errori JavaScript comuni.