Hvordan fikse «JavaScript Heap tom minnefeil»

JavaScript er fortsatt et av de mest brukte programmeringsspråkene på grunn av dets allsidighet. For å kjøre JavaScript utenfor et nettlesermiljø, må utviklere installere Node.js, et kjøretidsmiljø på tvers av plattformer.

JavaScript-haugen tom for minne-feil er vanlig når du kjører et JavaScript Node.js-prosjekt.

Problem med JavaScript-haug tom for minne er en feil som oppstår når standardminnet tildelt av datasystemet ikke er tilstrekkelig til å kjøre et stort prosjekt.

Hvis du støter på feilen med mye minne, vil programmet krasje og vise denne utgangen;

FATAL FEIL: CALL_AND_RETRY_LAST Tildeling mislyktes – JavaScript-haug tom for minne

Eller

Fatal feil: ugyldig tabellstørrelsestildeling mislyktes – javascript-haugen er tom for minne

Årsaker til feil med feil i JavaScript-haugen

  • Tilstedeværelse av store datastrukturer: Arbeid med store datastrukturer som matriser eller matriser kan forbruke mye plass, og til slutt føre til feil med mye minne.

Dette er et eksempel på en stor datastruktur med én milliard elementer;

let array = [];

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

  array.push(i);

}
  • Dårlig minneadministrasjon: Etter hvert som applikasjonen din vokser, må du gi slipp på noen av objektene du ikke lenger trenger.

Dette er et eksempel på en funksjon som fører til minnelekkasje;

let array = [];

setInterval(function() {

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

}, 1000);
  • Uendelige sløyfer: En slik kode kjører for alltid ettersom en avsluttende tilstand aldri nås.

Dette er et eksempel på en uendelig løkke som vil kjøre for alltid;

while (true) {

    console.log(1);

}

Uendelige løkker kan føre til denne feilen da den bruker minne ganske raskt.

  • Rekursive funksjoner: En rekursiv funksjon er en funksjon som kaller seg selv indirekte eller direkte for å gjenta et/bestemt sett med instruksjoner inntil en bestemt betingelse(er) er oppfylt. Hvis disse funksjonene er godt utformet, vil de sannsynligvis føre til minneledning og til slutt massevis av minnefeil.
  • Tilstedeværelse av mange objekter i et stykke kode: Hvis koden din har mange store objekter, kan minnet som brukes opp av disse objektene samlet føre til overbelastning.

Rett opp feil i JS-haugen uten minne

Denne feilen kan oppstå i Windows, macOS og Linux-baserte operativsystemer som Ubuntu. Heldigvis kan feilen fikses, uavhengig av operativsystemet ditt.

#1. Retting av JavaScript-haugen tom for minne-feil på Windows OS

Trinn 1: Klikk på startmenyen og finn Avanserte systeminnstillinger.

Trinn 2: Klikk på miljøvariablene nederst til venstre i dialogboksen.

Trinn 3: Klikk Ny på enten Brukervariabler eller Systemvariabler. Det første alternativet bruker endringene på gjeldende brukerkonto. Det andre alternativet gjelder imidlertid endringene for hele systemet.

Trinn 4: Det vil vises to alternativer; på variabelnavn, skriv inn NODE_OPTIONS og på Variabelverdi, skriv inn –max-old-space-size=4096. I dette trinnet vil 4096-tallet allokere 4 GB virtuelt minne til Node.js. Du kan tildele mer, for eksempel 8 GB, ved å sette verdien som –max-old-space-size=8192.

Trinn 5: Klikk ok, bruk og til slutt, ok for å lagre endringene.

Du kan også bruke Windows PowerShell-terminalen for å løse feilen. Åpne terminalen på Windows OS og skriv inn følgende kommando;

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

Du kan også løse feilen midlertidig ved å kjøre denne kommandoen før du kjører appen;

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

#2. Retter feil med JavaScript-haug tom for minne på Linux

  • Trinn 1: Identifiser feilkilden. Sjekk konsollloggene eller utdataene for å finne linjene med kode/fil som forårsaker feilen.
  • Trinn 2: Eksporter en miljøvariabel som spesifiserer det virtuelle minnet du har allokert til Node.js. Bruk denne kommandoen;
export NODE_OPTIONS=--max-old-space-size=4096

Disse trinnene vil allokere 4 GB virtuelt minne til Node.js. Hvis feilen fortsatt vedvarer, kan du øke minnestørrelsen ved å doble.

For eksempel, hvis du ønsker å tildele 8 GB som det virtuelle minnet, kan du kjøre denne kommandoen;

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

#3. Retter feil med JavaScript-haug med minne på macOS

Du kan løse JavaScript-haugen tom for minne-feil i macOS ved å bruke en lignende tilnærming som i Linux. Følg disse instruksjonene;

  • Trinn 1: Identifiser feilkilden ved å sjekke konsollloggene eller utdataene for å finne linjene med kode/fil som forårsaker feilen.
  • Trinn 2: Eksporter en miljøvariabel som spesifiserer virtuelt minne du har allokert til Node.js. Bruk denne kommandoen;
export NODE_OPTIONS=--max-old-space-size=4096

Disse trinnene vil allokere 4 GB virtuelt minne til Node.js. Hvis feilen fortsatt vedvarer, kan du øke minnestørrelsen ved å doble.

For eksempel, hvis du ønsker å tildele 8 GB som det virtuelle minnet, kan du kjøre denne kommandoen;

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

Øker minnet under NPM-installasjon

Løsningene vi har tilbudt så langt passer til feil som oppstår når du kjører en Node.js-applikasjon. Du kan imidlertid allokere virtuelt minne for å løse feil med mye minne når du installerer JavaScript-pakker. Bruk denne kommandoen;

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

Merk: Du kan fortsette å øke tildelingen av virtuelt minne med 1 GB, 2 GB, 3 GB eller 4 GB. Du må spesifisere minnestørrelse i MB. Ikke alloker hele maskinens minne til Node.js, da dette kan føre til at programmet krasjer. Som en god praksis, hvis maskinen din har 16 GB, kan du allokere opptil 8 GB til Node.js.

Forhindre JavaScript at haugen er tom for minne-feil

Vi har så langt diskutert hvordan du kan fikse JavaScript-haugen uten minne-feil når den oppstår. Heldigvis kan du også ha tiltak for å forhindre at denne feilen oppstår mens du kjører JavaScript-kode. Dette er noen av de beste tilnærmingene:

#1. Del data i små biter

Du kan ha et Node.js-program som importerer store datasett fra store CSV-filer gjennom ETL: Extract – Transform – Load-prosessen. Du kan oppleve at appen din alltid krasjer når du prøver å importere dataene. Hvis du jobber med MongoDB, kan du løse feilen ved å ha en kommandolinjeinstruksjon som;

split -l 1000000 users.csv

Denne kommandoen instruerer Node.js til å dele en fil med navn brukere i flere filer med 1000000 brukere hver. -l-flagget spesifiserer at filen skal deles basert på antall linjer med kode.

#2. Overvåk minnebruk

Du kan bruke en minneprofiler for å oppdage minnelekkasjer i koden din. Du kan kombinere Node.js» innebygde minne og ChromeDevTools for å oppnå dette. De to kan oppdage problemer i koden din og fikse dem.

Du kan også bruke eksterne verktøy som Datadog, New Relic og AppDynamics for å overvåke ytelsen til appen din og iverksette nødvendige tiltak. Du kan også sjekke minnebruk på Node.js-appen din gjennom process.memoryUsage()-metoden.

#3. Unngå minnelekkasjer

Minnelekkasjer oppstår når Node.js-appen din beholder referanser til objekter som den ikke lenger trenger. Hvis slike gjenstander ikke samles opp, vil det oppstå en oppbygging av minnebruk over tid.

Det er flere tilnærminger for å unngå minnelekkasjer, for eksempel å unngå globale variabler i koden din, unngå blokkering av I/O-operasjoner og bruke let og const nøkkelord når du erklærer variablene dine i stedet for var.

#4. Gyteprosesser

Hvis du kjører Node.js på en maskin med begrenset minne, for eksempel Raspberry Pi, er det sannsynlig at du støter på feil med mye minne. Du kan ha én hovedprosess, og andre grupperes som arbeidere. Så snart masterprosessen oppdager at systemet går tom for minne, vil det drepe den prosessen og tildele oppgaven til en annen som ikke er overbelastet.

#5. Oppdater maskinvare

Hvis økende minneallokering og gjennomføring av de oppførte prosessene for å forhindre haug-tom-minnefeil ikke løser problemene dine, kan du vurdere å oppdatere maskinvaren. Node.js kan kjøre på RAM så lavt som 512 MB. Appen din vil imidlertid kreve mer RAM etter hvert som den vokser.

På den annen side kan øke antall CPUer også forbedre minnetildelingen. Ideelt sett vil 2 eller flere CPUer tillate applikasjonen din å bruke arbeidertråder for CPU-intensive oppgaver som kryptografi og bildebehandling.

Vanlige spørsmål

Hva forårsaker JavaScript-heap tom minne-feil?

Denne feilen kan skyldes flere årsaker;
1. Minnelekkasjer
2. Uendelige løkker
3. Tilstedeværelse av mange objekter i et prosjekt
4. Tilstedeværelse av store datastrukturer

Er JavaScript-haug uten minne-feil løses?

Ja. Du kan løse feilen gjennom;
1. Allokere mer virtuelt minne til Node.js
2. Eliminere minnelekkasjer
3. Optimalisering av koden
4. Oppgradering av maskinvaren

Hvordan kan du løse Heap Out of Memory-feil i React-appen?

React er et av de mest populære JavaScript-bibliotekene. Finn filen package.json i rotkatalogen og disse linjene til skriptdelen;

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

}

Innpakning

De fleste utviklere er vant til feil og kodefeil, ikke kjøretidsfeil, ettersom de kjører sine Node.js-programmer. Heldigvis trenger du ikke å bekymre deg, siden haugen med minnefeil kan fikses. Vi har definert hva JavaScript-haug uten minnefeil er, forklart hvordan du løser det, og hvordan du unngår det i ditt neste Node.js-prosjekt.

Deretter kan du også lese hvordan du unngår noen vanlige JavaScript-feil.