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.