Sådan rettes “JavaScript-bunke uden hukommelsesfejl”

JavaScript forbliver et af de mest brugte programmeringssprog på grund af dets alsidighed. For at køre JavaScript uden for et browsermiljø skal udviklere installere Node.js, et køretidsmiljø på tværs af platforme.

Fejlen med JavaScript-bunken uden hukommelse er almindelig, når du kører et JavaScript Node.js-projekt.

Problem med JavaScript-bunke hukommelse er en fejl, der opstår, når standardhukommelsen tildelt af computersystemet er utilstrækkelig til at køre et stort projekt.

Hvis du støder på fejlen, der mangler hukommelse, vil dit program gå ned og vise dette output;

FATAL FEJL: CALL_AND_RETRY_LAST Tildeling mislykkedes – JavaScript-bunke mangler hukommelse

Eller

Fatal fejl: ugyldig tabelstørrelsesallokering mislykkedes – javascript-bunke mangler hukommelse

Årsager til fejl i JavaScript-dynger uden hukommelse

  • Tilstedeværelse af store datastrukturer: Arbejde med store datastrukturer som f.eks. matricer eller arrays kan forbruge meget plads, hvilket i sidste ende kan forårsage fejl i hukommelsen.

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

let array = [];

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

  array.push(i);

}
  • Dårlig hukommelsesstyring: Efterhånden som din applikation vokser, skal du give slip på nogle af de objekter, du ikke længere har brug for.

Dette er et eksempel på en funktion, der fører til hukommelseslækage;

let array = [];

setInterval(function() {

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

}, 1000);
  • Uendelige sløjfer: Sådan en kode kører for evigt, da en afsluttende betingelse aldrig nås.

Dette er et eksempel på en uendelig løkke, der vil køre for evigt;

while (true) {

    console.log(1);

}

Uendelige sløjfer kan føre til denne fejl, da den bruger hukommelse ret hurtigt.

  • Rekursive funktioner: En rekursiv funktion er en funktion, der kalder sig selv indirekte eller direkte til at gentage et/visse sæt instruktion(er), indtil en bestemt betingelse(r) er opfyldt. Hvis disse funktioner er veldesignede, vil de sandsynligvis føre til hukommelsesledning og i sidste ende en masse hukommelsesfejl.
  • Tilstedeværelse af mange objekter i et stykke kode: Hvis din kode har mange store objekter, kan den hukommelse, der bruges af disse objekter tilsammen, føre til en overbelastning.
  Download: Prøv Microsofts nye Chromium-baserede Edge-browser i dag

Ret fejl i JS-bunken uden hukommelse

Denne fejl kan opstå i Windows, macOS og Linux-baserede operativsystemer som Ubuntu. Heldigvis kan fejlen rettes, uanset dit operativsystem.

#1. Løsning af JavaScript-bunken, der mangler hukommelsesfejl på Windows OS

Trin 1: Klik på startmenuen og find Avancerede systemindstillinger.

Trin 2: Klik på miljøvariablerne nederst til venstre i dialogboksen.

Trin 3: Klik på Ny på enten Brugervariable eller Systemvariable. Den første mulighed anvender ændringerne på den aktuelle brugerkonto. Den anden mulighed anvender dog ændringerne på hele systemet.

Trin 4: Der vil blive vist to muligheder; på variabelnavn, indtast NODE_OPTIONS og på Variabelværdi, indtast –max-old-space-size=4096. I dette trin vil 4096-tallet allokere 4GB virtuel hukommelse til Node.js. Du kan allokere mere, såsom 8 GB, ved at indstille værdien som –max-old-space-size=8192.

Trin 5: Klik på ok, anvend og til sidst ok for at gemme ændringerne.

Du kan også bruge Windows PowerShell-terminalen til at løse fejlen. Åbn terminalen på dit Windows OS og indtast følgende kommando;

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

Du kan også løse fejlen midlertidigt ved at køre denne kommando, før du kører din app;

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

#2. Retter JavaScript-dynge-mangel-fejl på Linux

  • Trin 1: Identificer fejlkilden. Kontroller konsollogfilerne eller -outputtet for at bestemme, hvilke linjer kode/fil der forårsager fejlen.
  • Trin 2: Eksporter en miljøvariabel, der angiver den virtuelle hukommelse, du har allokeret til Node.js. Brug denne kommando;
export NODE_OPTIONS=--max-old-space-size=4096

Disse trin vil allokere 4 GB virtuel hukommelse til Node.js. Hvis fejlen stadig fortsætter, kan du øge hukommelsesstørrelsen ved at fordoble.

For eksempel, hvis du ønsker at allokere 8 GB som den virtuelle hukommelse, kan du køre denne kommando;

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

#3. Løsning af JavaScript-dynge uden hukommelsesfejl på macOS

Du kan løse JavaScript-bunken uden hukommelsesfejl i macOS ved at bruge en lignende tilgang som i Linux. Følg disse trin;

  • Trin 1: Identificer fejlkilden ved at kontrollere konsollogfilerne eller outputtet for at bestemme kode-/fillinjerne, der forårsager fejlen.
  • Trin 2: Eksporter en miljøvariabel, der angiver virtuel hukommelse, du har allokeret til Node.js. Brug denne kommando;
export NODE_OPTIONS=--max-old-space-size=4096

Disse trin vil allokere 4 GB virtuel hukommelse til Node.js. Hvis fejlen stadig fortsætter, kan du øge hukommelsesstørrelsen ved at fordoble.

  Tjek nemt din pc-lyd og højttaler med disse 7 online lydtestværktøjer

For eksempel, hvis du ønsker at allokere 8 GB som den virtuelle hukommelse, kan du køre denne kommando;

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

Øger hukommelsen under NPM-installation

De løsninger, vi har tilbudt indtil videre, passer til fejl, der opstår, når du kører en Node.js-applikation. Du kan dog allokere virtuel hukommelse til at løse en fejl, der mangler hukommelse, mens du installerer JavaScript-pakker. Brug denne kommando;

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

Bemærk: Du kan blive ved med at øge tildelingen af ​​virtuel hukommelse med 1 GB, 2 GB, 3 GB eller 4 GB. Du skal angive hukommelsesstørrelse i MB. Dog skal du ikke allokere hele maskinens hukommelse til Node.js, da dette kan få dit program til at gå ned. Som en god praksis, hvis din maskine har 16 GB, kan du allokere op til 8 GB til Node.js.

Undgå JavaScript, at der ikke er hukommelsesfejl

Vi har indtil videre diskuteret, hvordan man kan rette JavaScript-bunken uden hukommelsesfejl, når den opstår. Heldigvis kan du også have foranstaltninger til at forhindre denne fejl i at opstå, mens du kører JavaScript-kode. Disse er nogle af de bedste tilgange:

#1. Opdel data i små bidder

Du har muligvis et Node.js-program, der importerer store datasæt fra store CSV-filer gennem ETL: Uddrag – Transform – Indlæs processen. Du kan opleve, at din app altid går ned, når du forsøger at importere dataene. Hvis du arbejder med MongoDB, kan du løse fejlen ved at have en kommandolinjeinstruktion såsom;

split -l 1000000 users.csv

Denne kommando instruerer Node.js til at opdele en fil med navnet brugere i flere filer med hver 1000000 brugere. Flaget -l angiver, at filen skal opdeles baseret på antallet af kodelinjer.

#2. Overvåg hukommelsesforbrug

Du kan bruge en hukommelsesprofiler til at opdage hukommelseslækager i din kode. Du kan kombinere Node.js’ indbyggede hukommelse og ChromeDevTools for at opnå dette. De to kan opdage problemer i din kode og rette dem.

Du kan også bruge eksterne værktøjer som Datadog, New Relic og AppDynamics til at overvåge ydeevnen af ​​din app og tage de nødvendige handlinger. Du kan også kontrollere hukommelsesbrug på din Node.js-app ved hjælp af process.memoryUsage()-metoden.

  Hvad er grøn teknologi, og hvorfor er det vigtigt for fremtiden?

#3. Undgå hukommelseslækager

Hukommelseslækager opstår, når din Node.js-app beholder referencer til objekter, som den ikke længere har brug for. Hvis sådanne genstande ikke opsamles affald, vil der med tiden ske en opbygning af hukommelsesforbrug.

Der er flere metoder til at undgå hukommelseslækager, såsom at undgå globale variabler i din kode, undgå blokering af I/O-operationer og bruge let og const nøgleord, når du erklærer dine variabler i stedet for var.

#4. Ægningsprocesser

Hvis du kører Node.js på en maskine med begrænset hukommelse, f.eks. Raspberry Pi, vil du sandsynligvis løbe ind i bunke mangel på hukommelsesfejl. Du kan have én hovedproces, og andre grupperes som arbejdere. Så snart masterprocessen registrerer, at systemet er ved at løbe tør for hukommelse, vil det dræbe denne proces og tildele opgaven til en anden, der ikke er overbelastet.

#5. Opdater hardware

Hvis øget hukommelsesallokering og udførelsen af ​​de anførte processer for at forhindre en bunke-mangel-fejl ikke løser dine problemer, kan du overveje at opdatere din hardware. Node.js kan køre på RAM så lavt som 512MB. Din app vil dog kræve mere RAM, efterhånden som den vokser.

På den anden side kan en forøgelse af antallet af CPU’er også forbedre hukommelsesallokeringen. Ideelt set vil 2 eller flere CPU’er tillade din applikation at bruge arbejdstråde til CPU-intensive opgaver såsom kryptografi og billedbehandling.

Ofte stillede spørgsmål

Hvad forårsager JavaScript Heap Out of Memory-fejl?

Denne fejl kan skyldes flere årsager;
1. Hukommelseslækager
2. Uendelige sløjfer
3. Tilstedeværelse af mange objekter i et projekt
4. Tilstedeværelse af store datastrukturer

Er JavaScript-bunken uden hukommelsesfejl løselig?

Ja. Du kan løse fejlen gennem;
1. Tildeling af mere virtuel hukommelse til Node.js
2. Eliminering af hukommelseslækager
3. Optimering af din kode
4. Opgradering af din hardware

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

React er et af de mest populære JavaScript-biblioteker. Find filen package.json i rodbiblioteket og disse linjer til scriptsektionen;

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

}

Afslutter

De fleste udviklere er vant til fejl og kodefejl, ikke runtime-fejl, da de kører deres Node.js-programmer. Heldigvis behøver du ikke bekymre dig, da fejlen, der mangler hukommelse, kan rettes. Vi har defineret, hvad JavaScript-heap out of memory-fejl er, forklaret, hvordan man løser det, og hvordan man undgår det i dit næste Node.js-projekt.

Dernæst kan du også læse, hvordan du undgår nogle almindelige JavaScript-fejl.