A „JavaScript halom memóriahiba” javítása

A JavaScript sokoldalúsága miatt továbbra is az egyik leggyakrabban használt programozási nyelv. A JavaScript böngészőkörnyezeten kívüli futtatásához a fejlesztőknek telepíteniük kell a Node.js-t, egy többplatformos futásidejű környezetet.

A JavaScript-halom kifogyott a memória hiba gyakori a JavaScript Node.js projekt futtatásakor.

A JavaScript kupac memóriaproblémája egy olyan hiba, amely akkor fordul elő, ha a számítógépes rendszer által lefoglalt alapértelmezett memória nem elegendő egy nagy projekt futtatásához.

Ha a halom megtelt memória hibával találkozik, a program összeomlik, és megjeleníti ezt a kimenetet;

VÉGZETES HIBA: CALL_AND_RETRY_LAST Az elosztás nem sikerült – JavaScript kupac megtelt

Vagy

Végzetes hiba: érvénytelen táblaméret-kiosztás nem sikerült – a javascript kupac megtelt a memóriában

A JavaScript halom memóriahiba okai

  • Nagy adatstruktúrák jelenléte: A nagy adatstruktúrákkal, például mátrixokkal vagy tömbökkel végzett munka sok helyet foglalhat el, ami végül memóriakiesési hibát okozhat.

Ez egy példa egy nagy adatszerkezetre, amely egymilliárd elemet tartalmaz;

let array = [];

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

  array.push(i);

}
  • Gyenge memóriakezelés: Az alkalmazás növekedésével el kell engednie néhány olyan objektumot, amelyekre már nincs szüksége.

Ez egy példa egy olyan funkcióra, amely memóriaszivárgáshoz vezet;

let array = [];

setInterval(function() {

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

}, 1000);
  • Végtelen hurkok: Egy ilyen kód örökké fut, mivel a befejező feltételt soha nem érik el.

Ez egy példa egy végtelen ciklusra, amely örökké végrehajtódik;

while (true) {

    console.log(1);

}

A végtelen hurkok ehhez a hibához vezethetnek, mivel elég gyorsan használja a memóriát.

  • Rekurzív függvények: A rekurzív függvény olyan függvény, amely közvetve vagy közvetlenül meghívja magát, hogy megismételjen egy/bizonyos utasításkészletet, amíg bizonyos feltétel(ek) nem teljesül(nek). Ha ezek a funkciók jól vannak megtervezve, valószínűleg memórialevezetéshez és végül memóriahibák halomához vezetnek.
  • Sok objektum jelenléte egy kódrészletben: Ha a kódban sok nagy objektum van, akkor az objektumok által együttesen elhasznált memória túlterheléshez vezethet.
  Az ExtShield segít megvédeni a Chrome-ot a rosszindulatú programoktól és a reklámszoftver-bővítményektől

Javítsa ki a JS kupac memóriahibaját

Ez a hiba Windows, macOS és Linux alapú operációs rendszerekben, például Ubuntuban fordulhat elő. Szerencsére a hiba javítható, az operációs rendszertől függetlenül.

#1. A JavaScript kupac memóriahiba javítása Windows operációs rendszeren

1. lépés: Kattintson a Start menüre, és keresse meg a Speciális rendszerbeállításokat.

2. lépés: Kattintson a Környezeti változók elemre a párbeszédpanel bal alsó részén.

3. lépés: Kattintson az Új gombra a Felhasználói vagy a Rendszerváltozóknál. Az első opció a módosításokat az aktuális felhasználói fiókra alkalmazza. A második lehetőség azonban a változtatásokat az egész rendszerre alkalmazza.

4. lépés: Két lehetőség jelenik meg; a változónévnél írja be a NODE_OPTIONS mezőt, a Változó értéknél pedig a –max-old-space-size=4096-ot. Ebben a lépésben a 4096-os szám 4 GB virtuális memóriát foglal le a Node.js számára. Többet is lefoglalhat, például 8 GB-ot, ha az értéket –max-old-space-size=8192 értékre állítja.

5. lépés: Kattintson az OK gombra, alkalmazza és végül az OK gombra a módosítások mentéséhez.

A hiba megoldásához használhatja a Windows PowerShell terminált is. Nyissa meg a terminált a Windows operációs rendszeren, és írja be a következő parancsot;

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

A hibát ideiglenesen úgy is megoldhatja, hogy az alkalmazás futtatása előtt futtassa ezt a parancsot;

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

#2. A JavaScript kupac memóriahiba javítása Linuxon

  • 1. lépés: Határozza meg a hiba forrását. Ellenőrizze a konzol naplóit vagy kimenetét a hibát okozó kód/fájl sorok meghatározásához.
  • 2. lépés: Exportáljon egy környezeti változót, amely megadja a Node.js számára lefoglalt virtuális memóriát. Használja ezt a parancsot;
export NODE_OPTIONS=--max-old-space-size=4096

Ezek a lépések 4 GB virtuális memóriát foglalnak le a Node.js számára. Ha a hiba továbbra is fennáll, a memória méretét megkétszerezheti.

Például, ha 8 GB-ot szeretne lefoglalni virtuális memóriaként, akkor futtassa ezt a parancsot;

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

#3. JavaScript kupac memóriahiba javítása macOS rendszeren

A JavaScript-halom memóriahiba megoldása macOS-ben a Linuxhoz hasonló megközelítéssel megoldható. Kovesd ezeket a lepeseket;

  • 1. lépés: Határozza meg a hiba forrását a konzolnaplók vagy kimenetek ellenőrzésével, hogy meghatározza a hibát okozó kód-/fájlsorokat.
  • 2. lépés: Exportáljon egy környezeti változót, amely meghatározza a Node.js számára lefoglalt virtuális memóriát. Használja ezt a parancsot;
export NODE_OPTIONS=--max-old-space-size=4096

Ezek a lépések 4 GB virtuális memóriát foglalnak le a Node.js számára. Ha a hiba továbbra is fennáll, a memória méretét megkétszerezheti.

  Melyik követési megelőzési beállítást érdemes használni a Microsoft Edge-ben?

Például, ha 8 GB-ot szeretne lefoglalni virtuális memóriaként, akkor futtassa ezt a parancsot;

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

Memória növelése az NPM telepítése során

Az általunk eddig kínált megoldások megfelelnek a Node.js alkalmazás futtatásakor fellépő hibáknak. A JavaScript-csomagok telepítésekor azonban lefoglalhat virtuális memóriát a memóriahalom-hiba megoldására. Használja ezt a parancsot;

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

Megjegyzés: A virtuális memória kiosztását folyamatosan növelheti 1 GB, 2 GB, 3 GB vagy 4 GB-tal. Meg kell adnia a memória méretét MB-ban. Azonban ne foglalja le a gép teljes memóriáját a Node.js-hez, mert ez a program összeomlását okozhatja. Jó gyakorlat szerint, ha a gépe 16 GB-tal rendelkezik, akár 8 GB-ot is lefoglalhat a Node.js számára.

Akadályozza meg, hogy a JavaScript elfogyott a memória

Eddig megbeszéltük, hogyan lehet javítani a JavaScript kupac kimerült memóriájában felmerülő hibát. Szerencsére olyan intézkedéseket is hozhat, amelyek megakadályozzák a hiba előfordulását JavaScript-kód futtatása közben. Íme néhány a legjobb megközelítések közül:

#1. Oszd fel az adatokat kis részekre

Előfordulhat, hogy rendelkezik egy Node.js programmal, amely nagy adatkészleteket importál nagy CSV-fájlokból az ETL: Kivonat – Átalakítás – Betöltés folyamaton keresztül. Előfordulhat, hogy az alkalmazás mindig összeomlik, amikor megpróbálja importálni az adatokat. Ha MongoDB-vel dolgozik, a hibát egy parancssori utasítással oldhatja meg, például;

split -l 1000000 users.csv

Ez a parancs arra utasítja a Node.js-t, hogy egy user nevű fájlt ossza fel több fájlra, egyenként 1000000 felhasználóval. Az -l jelző azt határozza meg, hogy a fájlt fel kell osztani a kódsorok száma alapján.

#2. A memóriahasználat figyelése

Memóriaprofilozó segítségével észlelheti a memóriaszivárgást a kódban. Ennek eléréséhez kombinálhatja a Node.js beépített memóriáját és a ChromeDevTools eszközt. A kettő észlelheti a kódban lévő problémákat, és kijavíthatja azokat.

  6 legjobb időgazdálkodási eszköz Linuxhoz

Használhat olyan külső eszközöket is, mint a Datadog, a New Relic és az AppDynamics az alkalmazás teljesítményének nyomon követésére és a szükséges intézkedések megtételére. A process.memoryUsage() metódussal is ellenőrizheti a Node.js alkalmazás memóriahasználatát.

#3. Memóriaszivárgások elkerülése

Memóriaszivárgás akkor fordul elő, amikor a Node.js alkalmazás megőrzi a hivatkozásokat azokra az objektumokra, amelyekre már nincs szüksége. Ha az ilyen objektumokat nem gyűjtik össze, akkor idővel a memóriahasználat felhalmozódik.

Számos módszer létezik a memóriaszivárgások elkerülésére, például a globális változók elkerülése a kódban, az I/O műveletek blokkolásának elkerülése, valamint a let és const kulcsszavak használata a változók deklarálásakor a var helyett.

#4. Az ívási folyamatok

Ha a Node.js fájlt korlátozott memóriával rendelkező gépen, például a Raspberry Pi-n futtatja, valószínűleg halom memóriahibaba ütközik. Egy főfolyamattal rendelkezhet, a többiek munkásként vannak csoportosítva. Amint a főfolyamat azt észleli, hogy a rendszerből kifogy a memória, leállítja a folyamatot, és a feladatot egy másikhoz rendeli hozzá, amely nem túlterhelt.

#5. Frissítse a hardvert

Ha a memóriafoglalás növelése és a felsorolt, a memóriahalom-hiba megelőzésére szolgáló folyamatok végrehajtása nem oldja meg a problémákat, akkor érdemes lehet a hardver frissítését megfontolni. A Node.js akár 512 MB RAM-on is futhat. Az alkalmazás azonban több RAM-ot igényel, ahogy nő.

Másrészt a CPU-k számának növelése javíthatja a memóriafoglalást is. Ideális esetben 2 vagy több CPU lehetővé teszi az alkalmazás számára, hogy munkaszálakat használjon olyan CPU-igényes feladatokhoz, mint például a titkosítás és a képfeldolgozás.

GYIK

Mi okozza a JavaScript-halom elfogyott memóriát?

Ezt a hibát több ok is okozhatja;
1. Memóriaszivárgás
2. Végtelen hurkok
3. Sok objektum jelenléte egy projektben
4. Nagy adatszerkezetek jelenléte

Megoldható a JavaScript-halom memóriahiba?

Igen. A hibát a következőn keresztül oldhatja meg;
1. Több virtuális memória lefoglalása a Node.js számára
2. Memóriaszivárgások kiküszöbölése
3. A kód optimalizálása
4. A hardver frissítése

Hogyan lehet megoldani a Heap Out of Memory hibát a React alkalmazásban?

A React az egyik legnépszerűbb JavaScript-könyvtár. Keresse meg a package.json fájlt a gyökérkönyvtárban, és keresse meg ezeket a sorokat a szkriptek szakaszban;

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

}

Becsomagolás

A legtöbb fejlesztő hozzászokott a hibákhoz és a kódhibákhoz, nem a futásidejű hibákhoz, mivel Node.js programjait futtatják. Szerencsére nem kell aggódnia, mivel a halom memóriahiba javítható. Meghatároztuk, hogy mi az a JavaScript kupac memóriahiba, elmagyaráztuk, hogyan lehet megoldani, és hogyan kerülhető el a következő Node.js projektben.

Ezután azt is elolvashatja, hogyan kerülhet el néhány gyakori JavaScript-hibát.