Hur man åtgärdar ”JavaScript Heap of Memory Error”

JavaScript är fortfarande ett av de mest använda programmeringsspråken på grund av dess mångsidighet. För att köra JavaScript utanför en webbläsarmiljö måste utvecklare installera Node.js, en körtidsmiljö för flera plattformar.

Felet med JavaScript-högen slut på minne är vanligt när ett JavaScript Node.js-projekt körs.

Problem med JavaScript-hög utan minne är ett fel som uppstår när standardminnet som tilldelats av datorsystemet är otillräckligt för att köra ett stort projekt.

Om du stöter på felet att minnet är slut, kommer ditt program att krascha och visa denna utdata;

FATALT FEL: CALL_AND_RETRY_LAST Tilldelning misslyckades – JavaScript-högen är slut

Eller

Allvarligt fel: ogiltig tabellstorleksallokering misslyckades – javascript-högen är slut på minne

Orsaker till fel i JavaScript-högen av minne

  • Förekomst av stora datastrukturer: Att arbeta med stora datastrukturer som matriser eller arrayer kan ta mycket utrymme, vilket så småningom kan orsaka fel på hög minne.

Detta är ett exempel på en stor datastruktur med en miljard element;

let array = [];

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

  array.push(i);

}
  • Dålig minneshantering: När din applikation växer måste du släppa några av de objekt som du inte längre behöver.

Detta är ett exempel på en funktion som leder till minnesläcka;

let array = [];

setInterval(function() {

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

}, 1000);
  • Oändliga loopar: En sådan kod körs för alltid eftersom ett avslutande tillstånd aldrig uppnås.

Detta är ett exempel på en oändlig loop som kommer att köras för alltid;

while (true) {

    console.log(1);

}

Oändliga loopar kan leda till detta fel eftersom det använder minne ganska snabbt.

  • Rekursiva funktioner: En rekursiv funktion är en funktion som anropar sig själv indirekt eller direkt för att repetera en viss uppsättning instruktioner tills ett eller flera villkor är uppfyllda. Om dessa funktioner är väldesignade kommer de sannolikt att leda till minnesledning och till slut en mängd minnesfel.
  • Närvaro av många objekt i en kodbit: Om din kod har många stora objekt kan minnet som används av dessa objekt tillsammans leda till en överbelastning.

Åtgärda JS-högen slut på minnesfel

Det här felet kan uppstå i Windows, macOS och Linux-baserade operativsystem som Ubuntu. Lyckligtvis går felet att fixa, oavsett ditt operativsystem.

#1. Åtgärda felet med JavaScript-högen slut på minne i Windows OS

Steg 1: Klicka på startmenyn och leta upp Avancerade systeminställningar.

Steg 2: Klicka på miljövariabler längst ner till vänster i dialogrutan.

Steg 3: Klicka på Ny på antingen Användarvariabler eller Systemvariabler. Det första alternativet tillämpar ändringarna på det aktuella användarkontot. Det andra alternativet tillämpar dock ändringarna på hela systemet.

Steg 4: Det kommer att visas två alternativ; på variabelnamn anger du NODE_OPTIONS och på Variabelvärde anger du –max-old-space-size=4096. I detta steg kommer siffran 4096 att allokera 4 GB virtuellt minne till Node.js. Du kan allokera mer, såsom 8 GB, genom att ställa in värdet som –max-old-space-size=8192.

Steg 5: Klicka på ok, tillämpa och slutligen, ok för att spara ändringarna.

Du kan också använda Windows PowerShell-terminalen för att lösa felet. Öppna terminalen på ditt Windows OS och skriv in följande kommando;

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

Du kan också lösa felet tillfälligt genom att köra det här kommandot innan du kör din app;

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

#2. Fixar fel i JavaScript-högen av minne på Linux

  • Steg 1: Identifiera felkällan. Kontrollera konsolloggarna eller utdata för att fastställa vilka rader kod/fil som orsakar felet.
  • Steg 2: Exportera en miljövariabel som anger det virtuella minnet du har allokerat till Node.js. Använd detta kommando;
export NODE_OPTIONS=--max-old-space-size=4096

Dessa steg kommer att allokera 4 GB virtuellt minne till Node.js. Om felet fortfarande kvarstår kan du öka minnesstorleken genom att fördubbla.

Till exempel, om du vill allokera 8 GB som virtuellt minne, kan du köra det här kommandot;

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

#3. Åtgärda fel i JavaScript-högen av minne på macOS

Du kan lösa JavaScript-högen av minnesfel i macOS med ett liknande tillvägagångssätt som i Linux. Följ dessa steg;

  • Steg 1: Identifiera felkällan genom att kontrollera konsolloggarna eller utdata för att fastställa vilka rader med kod/fil som orsakar felet.
  • Steg 2: Exportera en miljövariabel som anger virtuellt minne som du har allokerat till Node.js. Använd detta kommando;
export NODE_OPTIONS=--max-old-space-size=4096

Dessa steg kommer att allokera 4 GB virtuellt minne till Node.js. Om felet fortfarande kvarstår kan du öka minnesstorleken genom att fördubbla.

Till exempel, om du vill allokera 8 GB som virtuellt minne, kan du köra det här kommandot;

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

Ökar minne under NPM-installation

Lösningarna vi har erbjudit hittills passar fel som uppstår när du kör en Node.js-applikation. Däremot kan du allokera virtuellt minne för att lösa fel med högt minne när du installerar JavaScript-paket. Använd detta kommando;

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

Obs: Du kan fortsätta att öka tilldelningen av virtuellt minne med 1 GB, 2 GB, 3 GB eller 4 GB. Du måste ange minnesstorlek i MB. Tilldela dock inte hela maskinens minne till Node.js eftersom detta kan få ditt program att krascha. Som en bra praxis, om din maskin har 16 GB, kan du allokera upp till 8 GB till Node.js.

Förhindra att JavaScript har slut på minnesfel

Vi har hittills diskuterat hur man åtgärdar JavaScript-högen utan minnesfel när det inträffar. Lyckligtvis kan du också vidta åtgärder för att förhindra att detta fel uppstår när du kör JavaScript-kod. Det här är några av de bästa tillvägagångssätten:

#1. Dela upp data i små bitar

Du kan ha ett Node.js-program som importerar stora datamängder från stora CSV-filer via ETL: Extract – Transform – Load-processen. Du kan upptäcka att din app alltid kraschar när du försöker importera data. Om du arbetar med MongoDB kan du lösa felet genom att ha en kommandoradsinstruktion som;

split -l 1000000 users.csv

Detta kommando instruerar Node.js att dela upp en fil med namnet användare i flera filer med 1000000 användare var. Flaggan -l anger att filen ska delas baserat på antalet rader kod.

#2. Övervaka minnesanvändning

Du kan använda en minnesprofilerare för att upptäcka minnesläckor i din kod. Du kan kombinera Node.js inbyggda minne och ChromeDevTools för att uppnå detta. De två kan upptäcka problem i din kod och fixa dem.

Du kan också använda externa verktyg som Datadog, New Relic och AppDynamics för att övervaka prestandan för din app och vidta nödvändiga åtgärder. Du kan också kontrollera minnesanvändningen på din Node.js-app genom metoden process.memoryUsage() .

#3. Undviker minnesläckor

Minnesläckor uppstår när din Node.js-app behåller referenser till objekt som den inte längre behöver. Om sådana föremål inte samlas in med skräp kommer det att byggas upp minnesanvändning med tiden.

Det finns flera tillvägagångssätt för att undvika minnesläckor, som att undvika globala variabler i din kod, undvika att blockera I/O-operationer och använda let och const nyckelord när du deklarerar dina variabler istället för var.

#4. Lekprocesser

Om du kör Node.js på en maskin med begränsat minne, till exempel Raspberry Pi, kommer du sannolikt att stöta på fel utan minne. Du kan ha en huvudprocess och andra grupperas som arbetare. Så snart huvudprocessen upptäcker att systemet håller på att ta slut på minne, kommer den att döda den processen och tilldela uppgiften till en annan som inte är överbelastad.

#5. Uppdatera hårdvara

Om ökad minnesallokering och att utföra de angivna processerna för att förhindra fel på hög minne inte löser dina problem, kan du överväga att uppdatera din hårdvara. Node.js kan köras på RAM så lite som 512 MB. Din app kommer dock att kräva mer RAM när den växer.

Å andra sidan kan en ökning av antalet processorer också förbättra minnesallokeringen. Helst låter 2 eller fler processorer din applikation använda arbetstrådar för CPU-intensiva uppgifter som kryptografi och bildbehandling.

Vanliga frågor

Vad orsakar JavaScript Heap Out of Memory Error?

Detta fel kan orsakas av flera orsaker;
1. Minnesläckor
2. Oändliga slingor
3. Närvaro av många objekt i ett projekt
4. Förekomst av stora datastrukturer

Är JavaScript-högen slut på minnesfel lösbart?

Ja. Du kan lösa felet genom;
1. Tilldela mer virtuellt minne till Node.js
2. Eliminera minnesläckor
3. Optimera din kod
4. Uppgradera din hårdvara

Hur kan du lösa Heap Out of Memory-fel i React-appen?

React är ett av de mest populära JavaScript-biblioteken. Leta upp filen package.json i rotkatalogen och dessa rader till skriptsektionen;

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

}

Avslutar

De flesta utvecklare är vana vid buggar och kodfel, inte runtime-fel, eftersom de kör sina Node.js-program. Lyckligtvis behöver du inte oroa dig, eftersom felet i högen av minne kan åtgärdas. Vi har definierat vad JavaScript-hög utan minnesfel är, förklarat hur man löser det och hur man undviker det i ditt nästa Node.js-projekt.

Därefter kan du också läsa hur du undviker några vanliga JavaScript-fel.