Fiks «JavaScript-haug tom for minne»-feil: Komplett guide

JavaScript og Minnefeil: En Dypdykk

JavaScript fortsetter å være et av de mest brukte programmeringsspråkene, takket være sin fleksibilitet. For å kjøre JavaScript utenfor nettleseren, er det nødvendig å installere Node.js, et tverrplattform kjøretidsmiljø.

En vanlig utfordring utviklere møter når de jobber med JavaScript Node.js-prosjekter, er feilmeldingen «JavaScript-haugen tom for minne».

Denne feilen indikerer at systemets standard minnetildeling ikke er tilstrekkelig for å håndtere et større prosjekt.

Hvis du støter på denne minnefeilen, vil programmet som regel stoppe og vise en av følgende meldinger:

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

Eller:

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

Årsaker til «JavaScript-haugen tom for minne»-feilen

  • Store datastrukturer: Bruk av omfattende datastrukturer som matriser kan raskt konsumere minne, og føre til denne feilen.

Her 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 minnehåndtering: Når applikasjonen din vokser, er det viktig å frigjøre objekter som ikke lenger er nødvendige. Manglende minnehåndtering kan føre til minnelekkasjer.

Dette er et eksempel på en funksjon som kan føre til minnelekkasje:

let array = [];

setInterval(function() {

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

}, 1000);
  • Uendelige løkker: Løkker som aldri stopper vil kontinuerlig bruke minne og til slutt føre til feilen.

Her er et eksempel på en uendelig løkke:

while (true) {

    console.log(1);

}

Slike løkker kan raskt tømme minnet.

  • Rekursive funksjoner: Funksjoner som kaller seg selv kan føre til minnelekkasjer hvis de ikke er ordentlig utformet.
  • Mange objekter: En stor mengde objekter i koden din kan kollektivt overbelaste minnet.

Løsning på «JavaScript-haugen tom for minne»-feilen

Denne feilen kan oppstå i ulike operativsystemer som Windows, macOS og Linux (inkludert Ubuntu). Heldigvis finnes det løsninger uavhengig av operativsystemet.

#1. Løsning i Windows

Trinn 1: Åpne «Avanserte systeminnstillinger» via startmenyen.

Trinn 2: Klikk på «Miljøvariabler» nederst til venstre.

Trinn 3: Velg enten «Brukervariabler» eller «Systemvariabler» og klikk «Ny». Brukervariabler gjelder for gjeldende konto, mens systemvariabler gjelder hele systemet.

Trinn 4: I «Variabelnavn», skriv `NODE_OPTIONS`, og i «Variabelverdi», skriv `–max-old-space-size=4096`. Dette gir Node.js 4 GB virtuelt minne. Du kan øke dette, for eksempel til 8 GB ved å skrive `–max-old-space-size=8192`.

Trinn 5: Klikk «OK» for å lagre endringene.

Du kan også bruke Windows PowerShell-terminalen:

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

En midlertidig løsning er å kjøre følgende kommando før du starter appen:

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

#2. Løsning i Linux

  • Trinn 1: Identifiser kilden til feilen ved å sjekke konsollloggen.
  • Trinn 2: Eksporter en miljøvariabel for å tildele virtuelt minne til Node.js:
export NODE_OPTIONS=--max-old-space-size=4096

Dette tildeler 4 GB. Hvis feilen vedvarer, øk minnet ved å doble verdien, for eksempel:

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

#3. Løsning i macOS

Fremgangsmåten i macOS ligner på den i Linux:

  • Trinn 1: Finn kilden til feilen i konsollloggen.
  • Trinn 2: Eksporter miljøvariabelen:
export NODE_OPTIONS=--max-old-space-size=4096

Dette gir 4 GB. Øk om nødvendig ved å doble, for eksempel:

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

Øke minne under `npm install`

Disse løsningene hjelper når du kjører appen din. Du kan også tildele minne for å unngå feilen under installasjon av JavaScript-pakker:

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

Vær forsiktig med å ikke tildele for mye minne, og husk å spesifisere minnestørrelsen i MB. Om maskinen har 16GB, kan du for eksempel allokere opptil 8GB.

Forebygging av «JavaScript-haugen tom for minne»-feil

Det er mulig å ta forholdsregler for å unngå denne feilen i fremtiden.

#1. Del opp data

Ved håndtering av store datasett, bør du dele dem i mindre deler for å unngå minnebelastning.

Et eksempel er å dele en stor CSV-fil i mindre filer:

split -l 1000000 users.csv

#2. Overvåk minnebruk

Bruk minneprofiler for å oppdage minnelekkasjer i koden. Kombiner Node.js sine innebygde verktøy med ChromeDevTools for å analysere problemer.

Du kan også bruke eksterne verktøy som Datadog, New Relic og AppDynamics. Sjekk minnebruk med `process.memoryUsage()`.

#3. Unngå minnelekkasjer

Minnelekkasjer oppstår når applikasjonen beholder referanser til objekter som ikke lenger trengs.

Unngå globale variabler, blokkerende I/O-operasjoner og bruk `let` og `const` istedenfor `var`.

#4. Bruk prosessgruppering

På maskiner med begrenset minne, som Raspberry Pi, kan du dele prosessene i en masterprosess og arbeidere. Masterprosessen kan drepe overbelastede prosesser og tildele oppgaven til en annen.

#5. Oppgrader maskinvaren

Hvis minneallokering og andre tiltak ikke hjelper, kan det være nødvendig å oppgradere maskinvaren. Økning av CPU-kjerner kan også forbedre minnehåndteringen.

Ofte stilte spørsmål

Hva forårsaker JavaScript «Heap out of memory»-feilen?

Dette kan skyldes minnelekkasjer, uendelige løkker, mange objekter, eller store datastrukturer.

Kan denne feilen løses?

Ja. Løsningen inkluderer økt minnetildeling, eliminering av minnelekkasjer, optimalisering av koden, og oppgradering av maskinvaren.

Hvordan løser man dette i en React-app?

I `package.json`-filen, legg til `–max_old_space_size=4096` i `scripts`-delen:

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

}

Konklusjon

Selv om «Heap out of memory»-feilen kan virke skremmende, er den løsbar. Denne artikkelen har forklart årsakene, løsningene, og hvordan du kan forebygge den i dine Node.js-prosjekter.

Nå kan du også lese om hvordan du kan unngå andre vanlige JavaScript feil.