JavaScript joprojām ir viena no visvairāk izmantotajām programmēšanas valodām tās daudzpusības dēļ. Lai palaistu JavaScript ārpus pārlūkprogrammas vides, izstrādātājiem ir jāinstalē Node.js — starpplatformu izpildlaika vide.
Kļūda par JavaScript kaudzes iztrūkumu ir izplatīta, palaižot JavaScript Node.js projektu.
JavaScript kaudzes no atmiņas problēma ir kļūda, kas rodas, ja datorsistēmas piešķirtā noklusējuma atmiņa nav pietiekama liela projekta palaišanai.
Ja jūs saskaraties ar kļūdu, ka trūkst atmiņas, programma avarēs un parādīs šo izvadi;
FATAL KĻŪDA: CALL_AND_RETRY_LAST Piešķiršana neizdevās — JavaScript kaudze trūka atmiņas
Or
Fatāla kļūda: neizdevās piešķirt nederīgu tabulas lielumu — javascript kaudze pietrūka atmiņas
Kļūdas par JavaScript kaudzes izplūdumu cēloņi
- Lielu datu struktūru klātbūtne: darbs ar lielām datu struktūrām, piemēram, matricām vai masīviem, var aizņemt daudz vietas, galu galā izraisot atmiņas izzušanas kļūdu.
Šis ir piemērs lielai datu struktūrai ar vienu miljardu elementu;
let array = []; for (let i = 0; i < 1000000000; i++) { array.push(i); }
- Slikta atmiņas pārvaldība: lietojumprogrammai augot, jums ir jāatsakās no dažiem objektiem, kas jums vairs nav vajadzīgi.
Šis ir tādas funkcijas piemērs, kas izraisa atmiņas noplūdi;
let array = []; setInterval(function() { array.push(new Array(1000000).join("x")); }, 1000);
- Bezgalīgas cilpas: šāds kods darbojas mūžīgi, jo nekad netiek sasniegts beigu nosacījums.
Šis ir bezgalīgas cilpas piemērs, kas tiks izpildīts mūžīgi;
while (true) { console.log(1); }
Bezgalīgas cilpas var izraisīt šo kļūdu, jo tā diezgan ātri izmanto atmiņu.
- Rekursīvās funkcijas: Rekursīvā funkcija ir funkcija, kas netieši vai tieši izsauc sevi, lai atkārtotu noteiktu instrukciju kopu, līdz tiek izpildīts(-i) noteikts(-i) nosacījums(-i). Ja šīs funkcijas ir labi izstrādātas, tās, iespējams, izraisīs atmiņas pārtraukšanu un galu galā atmiņas kļūdu kaudzi.
- Daudzu objektu klātbūtne koda daļā: ja kodā ir daudz lielu objektu, šo objektu kopējā izmantotā atmiņa var izraisīt pārslodzi.
Izlabojiet JS kaudzes kļūdu, ja trūkst atmiņas
Šī kļūda var rasties operētājsistēmās Windows, macOS un Linux, piemēram, Ubuntu. Par laimi, kļūdu var novērst neatkarīgi no jūsu operētājsistēmas.
#1. Kļūdas JavaScript kaudzes novēršana operētājsistēmā Windows OS
1. darbība: noklikšķiniet uz izvēlnes Sākt un atrodiet Sistēmas papildu iestatījumi.
2. darbība: noklikšķiniet uz Vides mainīgie dialoglodziņa apakšējā kreisajā stūrī.
3. darbība. Noklikšķiniet uz Jauns uz Lietotāja mainīgajiem vai Sistēmas mainīgajiem. Pirmā opcija piemēro izmaiņas pašreizējā lietotāja kontā. Tomēr otrā iespēja attiecina izmaiņas uz visu sistēmu.
4. darbība: tiks parādītas divas opcijas; uz mainīgā nosaukuma ievadiet NODE_OPTIONS un mainīgā vērtībā ievadiet –max-old-space-size=4096. Šajā darbībā skaitlis 4096 piešķirs 4 GB virtuālo atmiņu Node.js. Varat piešķirt vairāk, piemēram, 8 GB, iestatot vērtību kā –max-old-space-size=8192.
5. darbība: noklikšķiniet uz Labi, piemērojiet un, visbeidzot, OK, lai saglabātu izmaiņas.
Kļūdas novēršanai varat izmantot arī Windows PowerShell termināli. Atveriet termināli savā Windows operētājsistēmā un ievadiet šādu komandu;
env:NODE_OPTIONS="--max-old-space-size=4096"
Varat arī īslaicīgi novērst kļūdu, izpildot šo komandu pirms lietotnes palaišanas;
set NODE_OPTIONS=--max-old-space-size=4096
#2. Notiek JavaScript kaudzes kļūdas novēršana operētājsistēmā Linux
- 1. darbība: identificējiet kļūdas avotu. Pārbaudiet konsoles žurnālus vai izvadi, lai noteiktu koda/faila rindas, kas izraisa kļūdu.
- 2. darbība. Eksportējiet vides mainīgo, norādot virtuālo atmiņu, ko esat piešķīris Node.js. Izmantojiet šo komandu;
export NODE_OPTIONS=--max-old-space-size=4096
Veicot šīs darbības, Node.js tiks piešķirta 4 GB virtuālā atmiņa. Ja kļūda joprojām pastāv, varat palielināt atmiņas apjomu, dubultojot.
Piemēram, ja vēlaties piešķirt 8 GB kā virtuālo atmiņu, varat palaist šo komandu;
export NODE_OPTIONS=--max-old-space-size=8192
#3. JavaScript kaudzes kļūdas novēršana operētājsistēmā MacOS
Varat atrisināt JavaScript kaudzes kļūdu operētājsistēmā MacOS, izmantojot līdzīgu pieeju kā operētājsistēmā Linux. Izpildiet šīs darbības;
- 1. darbība: identificējiet kļūdas avotu, pārbaudot konsoles žurnālus vai izvadi, lai noteiktu koda/faila rindas, kas izraisa kļūdu.
- 2. darbība. Eksportējiet vides mainīgo, norādot virtuālo atmiņu, ko esat piešķīris Node.js. Izmantojiet šo komandu;
export NODE_OPTIONS=--max-old-space-size=4096
Veicot šīs darbības, Node.js tiks piešķirta 4 GB virtuālā atmiņa. Ja kļūda joprojām pastāv, varat palielināt atmiņas apjomu, dubultojot.
Piemēram, ja vēlaties piešķirt 8 GB kā virtuālo atmiņu, varat palaist šo komandu;
export NODE_OPTIONS=--max-old-space-size=8192
Atmiņas palielināšana NPM instalēšanas laikā
Līdz šim piedāvātie risinājumi ir piemēroti kļūdām, kas rodas, palaižot lietojumprogrammu Node.js. Tomēr, instalējot JavaScript pakotnes, varat piešķirt virtuālo atmiņu, lai novērstu atmiņas trūkuma kļūdu. Izmantojiet šo komandu;
node --max-old-space-size=4096 (which npm) install
Piezīme. Varat turpināt palielināt virtuālās atmiņas piešķiršanu par 1 GB, 2 GB, 3 GB vai 4 GB. Jums jānorāda atmiņas lielums MB. Tomēr nepiešķiriet visu mašīnas atmiņu Node.js, jo tas var izraisīt programmas avāriju. Ja jūsu datoram ir 16 GB, ieteicams vietnei Node.js piešķirt līdz 8 GB.
Novērst JavaScript kaudzes no atmiņas kļūdu
Mēs līdz šim esam apsprieduši, kā novērst JavaScript kaudzes kļūdu, kad tā rodas. Par laimi, varat arī veikt pasākumus, lai novērstu šīs kļūdas rašanos, palaižot JavaScript kodu. Šīs ir dažas no labākajām pieejām:
#1. Sadaliet datus mazos gabalos
Iespējams, jums ir programma Node.js, kas importē lielas datu kopas no lieliem CSV failiem, izmantojot ETL: Izvilkšana – Pārveidošana – Ielādes process. Mēģinot importēt datus, iespējams, jūsu lietotne vienmēr avarē. Ja strādājat ar MongoDB, kļūdu var atrisināt, izmantojot komandrindas instrukciju, piemēram;
split -l 1000000 users.csv
Šī komanda uzdod Node.js sadalīt failu ar nosaukumu Users vairākos failos, kuros katrā ir 1000000 lietotāju. Karogs -l norāda, ka fails ir jāsadala, pamatojoties uz koda rindu skaitu.
#2. Pārraugiet atmiņas izmantošanu
Varat izmantot atmiņas profilētāju, lai kodā noteiktu atmiņas noplūdes. Lai to panāktu, varat apvienot Node.js iebūvēto atmiņu un ChromeDevTools. Abi var atklāt problēmas jūsu kodā un tās novērst.
Varat arī izmantot ārējos rīkus, piemēram, Datadog, New Relic un AppDynamics, lai pārraudzītu savas lietotnes veiktspēju un veiktu nepieciešamās darbības. Varat arī pārbaudīt atmiņas lietojumu savā lietotnē Node.js, izmantojot metodi process.memoryUsage().
#3. Izvairīšanās no atmiņas noplūdēm
Atmiņas noplūde rodas, ja jūsu lietotne Node.js saglabā atsauces uz objektiem, kas tai vairs nav vajadzīgi. Ja šādi objekti netiek savākti, atmiņas lietojums laika gaitā palielināsies.
Ir vairākas pieejas, lai izvairītos no atmiņas noplūdēm, piemēram, izvairīšanās no globālajiem mainīgajiem kodā, izvairīšanās no I/O darbību bloķēšanas un izmantot atslēgvārdus let un const, deklarējot mainīgos, nevis var.
#4. Nārsta procesi
Ja izmantojat Node.js iekārtā ar ierobežotu atmiņu, piemēram, Raspberry Pi, visticamāk, radīsies kaudzēm pietrūkst atmiņas. Jums var būt viens galvenais process, un citi tiek grupēti kā darbinieki. Tiklīdz galvenais process konstatē, ka sistēmai sāk beigties atmiņa, tas iznīcinās šo procesu un piešķirs uzdevumu citam, kas nav pārslogots.
#5. Atjauniniet aparatūru
Ja atmiņas piešķīruma palielināšana un uzskaitīto procesu veikšana, lai novērstu kļūdu uzkrāšanos atmiņā, neatrisina jūsu problēmas, varat apsvērt aparatūras atjaunināšanu. Node.js var darboties ar RAM līdz 512 MB. Tomēr jūsu lietotnei būs nepieciešams vairāk RAM, tai pieaugot.
No otras puses, palielinot CPU skaitu, var uzlabot arī atmiņas piešķiršanu. Ideālā gadījumā 2 vai vairāk CPU ļaus jūsu lietojumprogrammai izmantot darbinieku pavedienus CPU intensīviem uzdevumiem, piemēram, kriptogrāfijai un attēlu apstrādei.
FAQ
Kas izraisa JavaScript kaudzes kļūdu kļūdu?
Šo kļūdu var izraisīt vairāki iemesli;
1. Atmiņas noplūdes
2. Bezgalīgas cilpas
3. Daudzu objektu klātbūtne projektā
4. Lielu datu struktūru klātbūtne
Vai JavaScript kaudzes kļūda ir atrisināma?
Jā. Jūs varat novērst kļūdu, izmantojot;
1. Vairāk virtuālās atmiņas piešķiršana Node.js
2. Atmiņas noplūdes novēršana
3. Koda optimizēšana
4. Aparatūras jaunināšana
Kā jūs varat atrisināt kļūdu Heap Out of Memory lietotnē React?
React ir viena no populārākajām JavaScript bibliotēkām. Atrodiet failu package.json saknes direktorijā un šīs rindas uz skriptu sadaļu;
"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" }
Iesaiņošana
Lielākā daļa izstrādātāju ir pieraduši pie kļūdām un koda kļūdām, nevis izpildlaika kļūdām, jo viņi palaiž savas programmas Node.js. Par laimi, jums nav jāuztraucas, jo kļūdu, kas radusies bez atmiņas, var novērst. Mēs esam definējuši, kas ir JavaScript kaudzes no atmiņas kļūda, paskaidrojuši, kā to atrisināt un kā no tās izvairīties nākamajā Node.js projektā.
Tālāk varat arī izlasīt, kā izvairīties no dažām izplatītām JavaScript kļūdām.