Cum să remediați „Eroarea de memorie JavaScript Heap Out of Memory”

JavaScript rămâne unul dintre cele mai utilizate limbaje de programare datorită versatilității sale. Pentru a rula JavaScript în afara unui mediu de browser, dezvoltatorii trebuie să instaleze Node.js, un mediu de rulare multiplatformă.

Eroarea de descărcare a memoriei JavaScript este frecventă atunci când rulează un proiect JavaScript Node.js.

Problema memoriei JavaScript este o eroare care apare atunci când memoria implicită alocată de sistemul computerizat este insuficientă pentru a rula un proiect mare.

Dacă întâmpinați eroarea de epuizare a memoriei, programul dvs. se va bloca și va afișa această ieșire;

EROARE FATALĂ: CALL_AND_RETRY_LAST Alocarea nu a reușit – memorie JavaScript epuizată

Sau

Eroare fatală: alocarea nevalidă a dimensiunii tabelului a eșuat – memorie javascript epuizată

Cauzele erorii de memorie JavaScript în memorie

  • Prezența unor structuri mari de date: lucrul cu structuri mari de date, cum ar fi matrice sau matrice, poate consuma mult spațiu, provocând în cele din urmă erori de memorie.

Acesta este un exemplu de structură mare de date cu un miliard de elemente;

let array = [];

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

  array.push(i);

}
  • Gestionare slabă a memoriei: pe măsură ce aplicația dvs. crește, trebuie să renunțați la unele dintre obiectele de care nu mai aveți nevoie.

Acesta este un exemplu de funcție care duce la scurgeri de memorie;

let array = [];

setInterval(function() {

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

}, 1000);
  • Bucle infinite: un astfel de cod rulează pentru totdeauna, deoarece o condiție de terminare nu este niciodată atinsă.

Acesta este un exemplu de buclă infinită care se va executa pentru totdeauna;

while (true) {

    console.log(1);

}

Buclele infinite pot duce la această eroare, deoarece utilizează memoria destul de repede.

  • Funcții recursive: O funcție recursivă este o funcție care se autoinvocă indirect sau direct pentru a repeta un/un anumit set de instrucțiuni până când o anumită condiție este îndeplinită. Dacă aceste funcții sunt bine proiectate, ele vor duce probabil la un lead de memorie și, eventual, la o grămadă de erori de memorie.
  • Prezența multor obiecte într-o bucată de cod: dacă codul dvs. are multe obiecte mari, memoria utilizată de acele obiecte în mod colectiv poate duce la o supraîncărcare.
  Cum să vizualizați utilizatorii de sistem în Linux pe Ubuntu

Remediați eroarea de memorie JS heap out of memory

Această eroare poate apărea în sistemele de operare Windows, macOS și Linux, cum ar fi Ubuntu. Din fericire, eroarea poate fi remediată, indiferent de sistemul dvs. de operare.

#1. Remedierea erorii de stocare a memoriei JavaScript pe sistemul de operare Windows

Pasul 1: Faceți clic pe meniul Start și găsiți Setări avansate de sistem.

Pasul 2: Faceți clic pe Variabilele de mediu din partea stângă jos a casetei de dialog.

Pasul 3: Faceți clic pe Nou fie pe Variabile utilizator, fie pe Variabile sistem. Prima opțiune aplică modificările contului de utilizator curent. Cu toate acestea, a doua opțiune aplică modificările întregului sistem.

Pasul 4: Vor fi afișate două opțiuni; pe numele variabilei, introduceți NODE_OPTIONS și pe Valoare variabilă, introduceți –max-old-space-size=4096. În acest pas, cifra 4096 va aloca 4 GB memorie virtuală pentru Node.js. Puteți aloca mai multe, cum ar fi 8 GB, setând valoarea ca –max-old-space-size=8192.

Pasul 5: Faceți clic pe ok, aplicați și în sfârșit, ok pentru a salva modificările.

De asemenea, puteți utiliza terminalul Windows PowerShell pentru a rezolva eroarea. Deschideți terminalul pe sistemul de operare Windows și introduceți următoarea comandă;

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

De asemenea, puteți rezolva temporar eroarea rulând această comandă înainte de a rula aplicația;

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

#2. Remedierea erorii de memorie JavaScript în heap pe Linux

  • Pasul 1: Identificați sursa erorii. Verificați jurnalele sau ieșirea consolei pentru a determina liniile de cod/fișier care cauzează eroarea.
  • Pasul 2: Exportați o variabilă de mediu care specifică memoria virtuală pe care ați alocat-o pentru Node.js. Utilizați această comandă;
export NODE_OPTIONS=--max-old-space-size=4096

Acești pași vor aloca 4 GB memorie virtuală pentru Node.js. Dacă eroarea persistă, puteți crește dimensiunea memoriei dublând.

De exemplu, dacă doriți să alocați 8 GB ca memorie virtuală, puteți rula această comandă;

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

#3. Remedierea erorii de memorie JavaScript în heap pe macOS

Puteți rezolva eroarea de memorie JavaScript în macOS folosind o abordare similară ca și în Linux. Urmați acești pași;

  • Pasul 1: Identificați sursa erorii verificând jurnalele sau ieșirea consolei pentru a determina liniile de cod/fișier care cauzează eroarea.
  • Pasul 2: Exportați o variabilă de mediu care specifică memoria virtuală pe care ați alocat-o pentru Node.js. Utilizați această comandă;
export NODE_OPTIONS=--max-old-space-size=4096

Acești pași vor aloca 4 GB memorie virtuală pentru Node.js. Dacă eroarea persistă, puteți crește dimensiunea memoriei dublând.

  Cum să vizualizați istoricul apelurilor telefonice pe Google

De exemplu, dacă doriți să alocați 8 GB ca memorie virtuală, puteți rula această comandă;

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

Creșterea memoriei în timpul instalării NPM

Soluțiile pe care le-am oferit până acum se potrivesc erorilor care apar atunci când rulați o aplicație Node.js. Cu toate acestea, puteți aloca memorie virtuală pentru a rezolva eroarea de memorie de memorie pe măsură ce instalați pachete JavaScript. Utilizați această comandă;

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

Notă: puteți continua să creșteți alocarea memoriei virtuale cu 1 GB, 2 GB, 3 GB sau 4 GB. Trebuie să specificați dimensiunea memoriei în MB. Cu toate acestea, nu alocați întreaga memorie a mașinii către Node.js, deoarece acest lucru poate cauza blocarea programului. Ca o practică bună, dacă mașina dvs. are 16 GB, puteți aloca până la 8 GB pentru Node.js.

Preveniți eroarea de memorie heap out of JavaScript

Am discutat până acum despre cum să remediam eroarea de epuizare a memoriei JavaScript când apare. Din fericire, puteți avea și măsuri pentru a preveni această eroare în timp ce rulați cod JavaScript. Acestea sunt câteva dintre cele mai bune abordări:

#1. Împărțiți datele în bucăți mici

Este posibil să aveți un program Node.js care importă seturi mari de date din fișiere CSV mari prin procesul ETL: Extragere – Transformare – Încărcare. Este posibil să descoperiți că aplicația dvs. se blochează întotdeauna când încercați să importați datele. Dacă lucrați cu MongoDB, puteți rezolva eroarea având o instrucțiune în linia de comandă, cum ar fi;

split -l 1000000 users.csv

Această comandă îi cere lui Node.js să împartă un fișier numit utilizatori în mai multe fișiere cu 1000000 de utilizatori fiecare. Indicatorul -l specifică faptul că fișierul trebuie împărțit în funcție de numărul de linii de cod.

#2. Monitorizați utilizarea memoriei

Puteți utiliza un profiler de memorie pentru a detecta scurgerile de memorie în codul dvs. Puteți combina memoria încorporată a lui Node.js și ChromeDevTools pentru a realiza acest lucru. Cei doi pot detecta probleme în codul dvs. și le pot rezolva.

De asemenea, puteți utiliza instrumente externe, cum ar fi Datadog, New Relic și AppDynamics, pentru a monitoriza performanța aplicației dvs. și pentru a lua măsurile necesare. De asemenea, puteți verifica utilizarea memoriei în aplicația Node.js prin metoda process.memoryUsage().

  Revizuirea Lenovo Legion Go: o dezamăgire frumoasă și voluminoasă

#3. Evitarea scurgerilor de memorie

Scurgerile de memorie apar atunci când aplicația dvs. Node.js păstrează referințe la obiecte de care nu mai are nevoie. Dacă astfel de obiecte nu sunt colectate de gunoi, va exista o acumulare de utilizare a memoriei în timp.

Există mai multe abordări pentru a evita scurgerile de memorie, cum ar fi evitarea variabilelor globale din codul dvs., evitarea blocării operațiunilor I/O și utilizarea cuvintelor cheie let și const atunci când vă declarați variabilele în loc de var.

#4. Procese de depunere a icrelor

Dacă rulați Node.js pe o mașină cu memorie limitată, cum ar fi Raspberry Pi, probabil că veți avea o grămadă de erori de memorie. Puteți avea un singur proces principal, iar altele sunt grupate ca lucrători. De îndată ce procesul principal detectează că sistemul rămâne fără memorie, va ucide acel proces și va atribui sarcina altuia care nu este supraîncărcat.

#5. Actualizați hardware

Dacă creșterea alocării memoriei și efectuarea proceselor enumerate de prevenire a erorii de stocare a memoriei nu vă rezolvă problemele, atunci puteți lua în considerare actualizarea hardware-ului. Node.js poate rula pe RAM de până la 512 MB. Cu toate acestea, aplicația dvs. va solicita mai multă memorie RAM pe măsură ce crește.

Pe de altă parte, creșterea numărului de procesoare poate îmbunătăți și alocarea memoriei. În mod ideal, 2 sau mai multe procesoare vor permite aplicației dvs. să utilizeze fire de lucru pentru activități care necesită un proces intensiv de CPU, cum ar fi criptografia și procesarea imaginilor.

Întrebări frecvente

Ce cauzează eroarea JavaScript Heap Out of Memory?

Această eroare poate fi cauzată din mai multe motive;
1. Scurgeri de memorie
2. Bucle infinite
3. Prezența multor obiecte într-un proiect
4. Prezența unor structuri mari de date

Eroarea JavaScript Heap Out of Memory poate fi rezolvată?

Da. Puteți rezolva eroarea prin;
1. Alocarea mai multă memorie virtuală la Node.js
2. Eliminarea scurgerilor de memorie
3. Optimizarea codului
4. Actualizarea hardware-ului

Cum puteți rezolva eroarea Heap Out of Memory în aplicația React?

React este una dintre cele mai populare biblioteci JavaScript. Localizați fișierul package.json în directorul rădăcină și aceste linii în secțiunea de scripturi;

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

}

Încheierea

Majoritatea dezvoltatorilor sunt obișnuiți cu erori și erori de codare, nu erori de rulare, deoarece își execută programele Node.js. Din fericire, nu trebuie să vă faceți griji, deoarece eroarea de stocare a memoriei poate fi remediată. Am definit ce este eroarea de memorie JavaScript, am explicat cum să o rezolvăm și cum să o evităm în următorul proiect Node.js.

În continuare, puteți citi și cum să evitați unele erori comune JavaScript.