Jak naprawić „Błąd braku pamięci sterty JavaScript”

JavaScript pozostaje jednym z najczęściej używanych języków programowania ze względu na swoją wszechstronność. Aby uruchomić JavaScript poza środowiskiem przeglądarki, programiści muszą zainstalować Node.js, wieloplatformowe środowisko uruchomieniowe.

Błąd braku pamięci sterty JavaScript jest powszechny podczas uruchamiania projektu JavaScript Node.js.

Problem braku pamięci sterty JavaScript to błąd, który pojawia się, gdy domyślna pamięć przydzielona przez system komputerowy jest niewystarczająca do uruchomienia dużego projektu.

Jeśli napotkasz błąd sterty braku pamięci, twój program ulegnie awarii i wyświetli to wyjście;

BŁĄD KRYTYCZNY: CALL_AND_RETRY_LAST Alokacja nie powiodła się – brak pamięci w stercie JavaScript

Lub

Błąd krytyczny: alokacja nieprawidłowego rozmiaru tabeli nie powiodła się – sterta javascript za mało pamięci

Przyczyny błędu sterty JavaScript z powodu braku pamięci

  • Obecność dużych struktur danych: praca z dużymi strukturami danych, takimi jak macierze lub tablice, może zajmować dużo miejsca, co ostatecznie powoduje błąd braku pamięci.

To jest przykład dużej struktury danych z miliardem elementów;

let array = [];

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

  array.push(i);

}
  • Słabe zarządzanie pamięcią: w miarę rozwoju aplikacji musisz zrezygnować z niektórych obiektów, których już nie potrzebujesz.

To jest przykład funkcji, która prowadzi do wycieku pamięci;

let array = [];

setInterval(function() {

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

}, 1000);
  • Nieskończone pętle: taki kod działa w nieskończoność, ponieważ warunek końcowy nigdy nie jest spełniony.

To jest przykład nieskończonej pętli, która będzie wykonywana w nieskończoność;

while (true) {

    console.log(1);

}

Nieskończone pętle mogą prowadzić do tego błędu, ponieważ dość szybko zużywają pamięć.

  • Funkcje rekurencyjne: Funkcja rekurencyjna to funkcja, która wywołuje się pośrednio lub bezpośrednio w celu powtórzenia określonego zestawu instrukcji, dopóki nie zostaną spełnione określone warunki. Jeśli te funkcje są dobrze zaprojektowane, prawdopodobnie doprowadzą do przewodzenia pamięci i ostatecznie do błędu sterty pamięci.
  • Obecność wielu obiektów w fragmencie kodu: jeśli twój kod zawiera wiele dużych obiektów, łączna pamięć zajmowana przez te obiekty może doprowadzić do przeciążenia.

Napraw błąd braku pamięci sterty JS

Ten błąd może wystąpić w systemach operacyjnych Windows, macOS i Linux, takich jak Ubuntu. Na szczęście błąd można naprawić, niezależnie od systemu operacyjnego.

# 1. Naprawianie błędu sterty JavaScript w pamięci w systemie operacyjnym Windows

Krok 1: Kliknij menu Start i znajdź Zaawansowane ustawienia systemu.

Krok 2: Kliknij Zmienne środowiskowe w lewej dolnej części okna dialogowego.

Krok 3: Kliknij Nowy w Zmiennych użytkownika lub Zmiennych systemowych. Pierwsza opcja stosuje zmiany do bieżącego konta użytkownika. Jednak druga opcja dotyczy zmian w całym systemie.

Krok 4: Zostaną wyświetlone dwie opcje; w nazwie zmiennej wpisz NODE_OPTIONS, a w polu Wartość zmiennej wpisz –max-old-space-size=4096. W tym kroku liczba 4096 przydzieli 4 GB pamięci wirtualnej do Node.js. Możesz przydzielić więcej, na przykład 8 GB, ustawiając wartość jako –max-old-space-size=8192.

Krok 5: Kliknij ok, zastosuj i na koniec ok, aby zapisać zmiany.

Możesz także użyć terminala Windows PowerShell, aby rozwiązać problem. Otwórz terminal w systemie operacyjnym Windows i wprowadź następujące polecenie;

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

Możesz także tymczasowo rozwiązać problem, uruchamiając to polecenie przed uruchomieniem aplikacji;

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

#2. Naprawianie błędu sterty JavaScript w pamięci w systemie Linux

  • Krok 1: Zidentyfikuj źródło błędu. Sprawdź dzienniki konsoli lub dane wyjściowe, aby określić wiersze kodu/pliku powodujące błąd.
  • Krok 2: Wyeksportuj zmienną środowiskową określającą pamięć wirtualną przydzieloną do Node.js. Użyj tego polecenia;
export NODE_OPTIONS=--max-old-space-size=4096

Te kroki spowodują przydzielenie 4 GB pamięci wirtualnej do Node.js. Jeśli błąd nadal występuje, możesz podwoić rozmiar pamięci.

Na przykład, jeśli chcesz przydzielić 8 GB jako pamięć wirtualną, możesz uruchomić to polecenie;

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

#3. Naprawianie błędu sterty JavaScript w pamięci w systemie macOS

Możesz rozwiązać problem braku pamięci sterty JavaScript w systemie macOS, stosując podobne podejście, jak w systemie Linux. Wykonaj następujące kroki;

  • Krok 1: Zidentyfikuj źródło błędu, sprawdzając dzienniki konsoli lub dane wyjściowe, aby określić wiersze kodu/pliku powodujące błąd.
  • Krok 2: Wyeksportuj zmienną środowiskową określającą pamięć wirtualną przydzieloną do Node.js. Użyj tego polecenia;
export NODE_OPTIONS=--max-old-space-size=4096

Te kroki spowodują przydzielenie 4 GB pamięci wirtualnej do Node.js. Jeśli błąd nadal występuje, możesz podwoić rozmiar pamięci.

Na przykład, jeśli chcesz przydzielić 8 GB jako pamięć wirtualną, możesz uruchomić to polecenie;

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

Zwiększanie pamięci podczas instalacji NPM

Oferowane przez nas do tej pory rozwiązania odpowiadają błędom, które pojawiają się podczas uruchamiania aplikacji Node.js. Można jednak przydzielić pamięć wirtualną, aby rozwiązać problem braku pamięci podczas instalowania pakietów JavaScript. Użyj tego polecenia;

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

Uwaga: możesz zwiększać alokację pamięci wirtualnej o 1 GB, 2 GB, 3 GB lub 4 GB. Musisz określić rozmiar pamięci w MB. Jednak nie przydzielaj całej pamięci maszyny do Node.js, ponieważ może to spowodować awarię programu. Jako dobrą praktykę, jeśli twoja maszyna ma 16 GB, możesz przydzielić do 8 GB dla Node.js.

Zapobiegnij wystąpieniu błędu sterty pamięci JavaScript

Do tej pory omówiliśmy, jak naprawić błąd braku pamięci sterty JavaScript, gdy się pojawi. Na szczęście możesz również mieć środki zapobiegające występowaniu tego błędu podczas uruchamiania kodu JavaScript. Oto niektóre z najlepszych podejść:

# 1. Podziel dane na małe porcje

Być może masz program Node.js, który importuje duże zestawy danych z dużych plików CSV za pośrednictwem procesu ETL: Extract – Transform – Load. Może się okazać, że Twoja aplikacja zawsze ulega awarii podczas próby zaimportowania danych. Jeśli pracujesz z MongoDB, możesz rozwiązać błąd, korzystając z instrukcji wiersza poleceń, takich jak;

split -l 1000000 users.csv

To polecenie instruuje Node.js, aby podzielił plik o nazwie users na wiele plików, z których każdy zawiera 1 000 000 użytkowników. Flaga -l określa, że ​​plik powinien zostać podzielony na podstawie liczby linii kodu.

#2. Monitoruj użycie pamięci

Możesz użyć profilera pamięci do wykrywania wycieków pamięci w kodzie. Aby to osiągnąć, możesz połączyć wbudowaną pamięć Node.js i narzędzia ChromeDevTools. Oba mogą wykrywać problemy w kodzie i je naprawiać.

Możesz także użyć zewnętrznych narzędzi, takich jak Datadog, New Relic i AppDynamics, aby monitorować wydajność swojej aplikacji i podejmować niezbędne działania. Możesz również sprawdzić użycie pamięci w aplikacji Node.js za pomocą metody process.memoryUsage() .

#3. Unikanie wycieków pamięci

Wycieki pamięci występują, gdy aplikacja Node.js zachowuje odwołania do obiektów, których już nie potrzebuje. Jeśli takie obiekty nie są usuwane bezużytecznie, z czasem nastąpi narastanie użycia pamięci.

Istnieje kilka sposobów uniknięcia wycieków pamięci, takich jak unikanie zmiennych globalnych w kodzie, unikanie blokowania operacji we/wy oraz używanie słów kluczowych let i const podczas deklarowania zmiennych zamiast var.

#4. Procesy tarła

Jeśli używasz Node.js na maszynie z ograniczoną pamięcią, takiej jak Raspberry Pi, prawdopodobnie napotkasz błędy sterty braku pamięci. Możesz mieć jeden proces główny, a inne są zgrupowane jako procesy robocze. Gdy tylko proces nadrzędny wykryje, że systemowi brakuje pamięci, zabije ten proces i przydzieli zadanie innemu, który nie jest przeciążony.

#5. Zaktualizuj sprzęt

Jeśli zwiększenie alokacji pamięci i przeprowadzenie wymienionych procesów zapobiegających błędom braku pamięci w stercie nie rozwiąże problemów, możesz rozważyć aktualizację sprzętu. Node.js może działać na pamięci RAM o wielkości zaledwie 512 MB. Jednak Twoja aplikacja będzie wymagać więcej pamięci RAM w miarę jej wzrostu.

Z drugiej strony zwiększenie liczby procesorów może również poprawić alokację pamięci. Idealnie byłoby, gdyby 2 lub więcej procesorów umożliwiło aplikacji korzystanie z wątków roboczych do zadań intensywnie korzystających z procesora, takich jak kryptografia i przetwarzanie obrazów.

Często zadawane pytania

Co powoduje błąd braku pamięci sterty JavaScript?

Ten błąd może być spowodowany kilkoma przyczynami;
1. Wycieki pamięci
2. Nieskończone pętle
3. Obecność wielu obiektów w projekcie
4. Obecność dużych struktur danych

Czy błąd JavaScript Heap Out of Memory można rozwiązać?

Tak. Możesz rozwiązać błąd poprzez;
1. Przydzielanie większej ilości pamięci wirtualnej do Node.js
2. Eliminacja wycieków pamięci
3. Optymalizacja kodu
4. Aktualizacja sprzętu

Jak rozwiązać błąd Heap Out of Memory w aplikacji React?

React to jedna z najpopularniejszych bibliotek JavaScript. Zlokalizuj plik package.json w katalogu głównym i te wiersze w sekcji skryptów;

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

}

Podsumowanie

Większość programistów jest przyzwyczajona do błędów i błędów w kodzie, a nie błędów w czasie wykonywania, gdy uruchamiają swoje programy Node.js. Na szczęście nie musisz się martwić, ponieważ błąd braku pamięci można naprawić. Zdefiniowaliśmy, czym jest błąd sterty pamięci JavaScript, wyjaśniliśmy, jak go rozwiązać i jak go uniknąć w następnym projekcie Node.js.

Następnie możesz również przeczytać, jak uniknąć niektórych typowych błędów JavaScript.