JavaScript zůstává jedním z nejpoužívanějších programovacích jazyků díky své univerzálnosti. Chcete-li spustit JavaScript mimo prostředí prohlížeče, musí vývojáři nainstalovat Node.js, běhové prostředí pro různé platformy.
Chyba nedostatku paměti v JavaScriptu je běžná při spuštění projektu JavaScript Node.js.
Problém nedostatku paměti v JavaScriptu je chyba, ke které dochází, když výchozí paměť přidělená počítačovým systémem nestačí ke spuštění velkého projektu.
Pokud narazíte na chybu s nedostatkem paměti, váš program se zhroutí a zobrazí tento výstup;
ZÁVAŽNÁ CHYBA: CALL_AND_RETRY_LAST Přidělení se nezdařilo – hromada JavaScriptu je nedostatek paměti
Nebo
Závažná chyba: neplatná alokace velikosti tabulky selhala – hromada javascriptu je nedostatek paměti
Table of Contents
Příčiny chyby způsobené nedostatkem paměti v JavaScriptu
- Přítomnost velkých datových struktur: Práce s velkými datovými strukturami, jako jsou matice nebo pole, může spotřebovat mnoho místa, což může případně způsobit hromadu nedostatku paměti.
Toto je příklad rozsáhlé datové struktury s jednou miliardou prvků;
let array = []; for (let i = 0; i < 1000000000; i++) { array.push(i); }
- Špatná správa paměti: Jak vaše aplikace roste, musíte opustit některé objekty, které již nepotřebujete.
Toto je příklad funkce, která vede k nevracení paměti;
let array = []; setInterval(function() { array.push(new Array(1000000).join("x")); }, 1000);
- Nekonečné smyčky: Takový kód běží věčně, protože nikdy není dosaženo ukončovací podmínky.
Toto je příklad nekonečné smyčky, která bude probíhat navždy;
while (true) { console.log(1); }
Nekonečné smyčky mohou vést k této chybě, protože využívá paměť velmi rychle.
- Rekurzivní funkce: Rekurzivní funkce je funkce, která se nepřímo nebo přímo volá, aby opakovala určitou sadu instrukcí, dokud není splněna určitá podmínka (podmínky). Pokud jsou tyto funkce dobře navrženy, pravděpodobně povedou k výpadku paměti a nakonec k hromadě chyb paměti.
- Přítomnost mnoha objektů v kusu kódu: Pokud má váš kód mnoho velkých objektů, může paměť spotřebovaná těmito objekty společně vést k přetížení.
Opravte chybu nedostatku paměti JS haldy
K této chybě může dojít v operačních systémech Windows, macOS a Linux, jako je Ubuntu. Naštěstí je chyba opravitelná, bez ohledu na váš operační systém.
#1. Oprava chyby způsobené nedostatkem paměti v JavaScriptu v operačním systému Windows
Krok 1: Klikněte na nabídku Start a vyhledejte Rozšířená nastavení systému.
Krok 2: Klikněte na Proměnné prostředí v levé dolní části dialogového okna.
Krok 3: Klikněte na Nový buď na Uživatelské proměnné nebo Systémové proměnné. První možnost aplikuje změny na aktuální uživatelský účet. Druhá možnost však aplikuje změny na celý systém.
Krok 4: Zobrazí se dvě možnosti; u názvu proměnné zadejte NODE_OPTIONS a u hodnoty proměnné zadejte –max-old-space-size=4096. V tomto kroku číslo 4096 přidělí 4GB virtuální paměti Node.js. Můžete přidělit více, například 8 GB, nastavením hodnoty jako –max-old-space-size=8192.
Krok 5: Klikněte na OK, použít a nakonec na OK pro uložení změn.
K vyřešení chyby můžete také použít terminál Windows PowerShell. Otevřete terminál v operačním systému Windows a zadejte následující příkaz;
env:NODE_OPTIONS="--max-old-space-size=4096"
Chybu můžete také dočasně vyřešit spuštěním tohoto příkazu před spuštěním aplikace;
set NODE_OPTIONS=--max-old-space-size=4096
#2. Oprava chyby s nedostatkem paměti v JavaScriptu v systému Linux
- Krok 1: Identifikujte zdroj chyby. Zkontrolujte protokoly nebo výstup konzoly a zjistěte, které řádky kódu/souboru způsobují chybu.
- Krok 2: Exportujte proměnnou prostředí určující virtuální paměť, kterou jste přidělili Node.js. Použijte tento příkaz;
export NODE_OPTIONS=--max-old-space-size=4096
Tyto kroky přidělí 4GB virtuální paměti Node.js. Pokud chyba stále přetrvává, můžete zvětšit velikost paměti zdvojnásobením.
Pokud například chcete alokovat 8 GB jako virtuální paměť, můžete spustit tento příkaz;
export NODE_OPTIONS=--max-old-space-size=8192
#3. Oprava chyby s nedostatkem paměti JavaScriptu v systému macOS
Chybu nedostatku paměti v JavaScriptu můžete v macOS vyřešit pomocí podobného přístupu jako v Linuxu. Následuj tyto kroky;
- Krok 1: Identifikujte zdroj chyby kontrolou protokolů nebo výstupu konzoly, abyste určili řádky kódu/souboru, které chybu způsobují.
- Krok 2: Exportujte proměnnou prostředí určující virtuální paměť, kterou jste přidělili Node.js. Použijte tento příkaz;
export NODE_OPTIONS=--max-old-space-size=4096
Tyto kroky přidělí 4GB virtuální paměti Node.js. Pokud chyba stále přetrvává, můžete zvětšit velikost paměti zdvojnásobením.
Pokud například chcete alokovat 8 GB jako virtuální paměť, můžete spustit tento příkaz;
export NODE_OPTIONS=--max-old-space-size=8192
Zvýšení paměti během instalace NPM
Řešení, která jsme doposud nabízeli, vyhovují chybám, ke kterým dochází při spuštění aplikace Node.js. Můžete však přidělit virtuální paměť a vyřešit tak chybu s nedostatkem paměti při instalaci balíčků JavaScript. Použijte tento příkaz;
node --max-old-space-size=4096 (which npm) install
Poznámka: Přidělování virtuální paměti můžete zvyšovat o 1 GB, 2 GB, 3 GB nebo 4 GB. Musíte zadat velikost paměti v MB. Nepřidělujte však Node.js celou paměť počítače, protože to může způsobit selhání vašeho programu. Pokud má váš počítač 16 GB, můžete přidělit až 8 GB Node.js.
Zabránit JavaScript hromadě nedostatek paměti chyba
Dosud jsme diskutovali o tom, jak opravit chybu nedostatku paměti v JavaScriptu, když k ní dojde. Naštěstí můžete mít také opatření, která zabrání výskytu této chyby při spouštění kódu JavaScript. Toto jsou některé z nejlepších přístupů:
#1. Rozdělte data na malé části
Možná máte program Node.js, který importuje velké datové sady z velkých souborů CSV prostřednictvím procesu ETL: Extract – Transform – Load. Při pokusu o import dat můžete zjistit, že aplikace vždy selže. Pokud pracujete s MongoDB, můžete chybu vyřešit pomocí instrukce příkazového řádku, jako je;
split -l 1000000 users.csv
Tento příkaz dává Node.js pokyn, aby rozdělil soubor s názvem users do více souborů, každý s 1000000 uživateli. Parametr -l určuje, že soubor by měl být rozdělen na základě počtu řádků kódu.
#2. Sledujte využití paměti
Ke zjištění úniků paměti ve vašem kódu můžete použít paměťový profiler. K dosažení tohoto cíle můžete kombinovat vestavěnou paměť Node.js a nástroje ChromeDevTools. Dva mohou detekovat problémy ve vašem kódu a opravit je.
Můžete také použít externí nástroje, jako je Datadog, New Relic a AppDynamics, ke sledování výkonu vaší aplikace a provedení nezbytných akcí. Využití paměti v aplikaci Node.js můžete také zkontrolovat pomocí metody process.memoryUsage().
#3. Předcházení únikům paměti
K únikům paměti dochází, když vaše aplikace Node.js uchovává odkazy na objekty, které již nepotřebuje. Pokud takové objekty nebudou shromažďovány odpadky, časem dojde k nárůstu využití paměti.
Existuje několik přístupů, jak se vyhnout únikům paměti, například vyhnout se globálním proměnným ve vašem kódu, vyhnout se blokování I/O operací a používat klíčová slova let a const při deklarování proměnných namísto var.
#4. Procesy tření
Pokud používáte Node.js na počítači s omezenou pamětí, jako je Raspberry Pi, pravděpodobně narazíte na chyby s nedostatkem paměti. Můžete mít jeden hlavní proces a ostatní jsou seskupeny jako pracovníci. Jakmile hlavní proces zjistí, že systému dochází paměť, ukončí tento proces a přiřadí úlohu jinému, který není přetížen.
#5. Aktualizujte hardware
Pokud zvýšení alokace paměti a provádění uvedených procesů zabraňujících chybám z haldy paměti nevyřeší vaše problémy, můžete zvážit aktualizaci hardwaru. Node.js může běžet na paměti RAM s minimální kapacitou 512 MB. Vaše aplikace však bude s růstem vyžadovat více paměti RAM.
Na druhou stranu zvýšení počtu CPU může také zlepšit alokaci paměti. V ideálním případě 2 nebo více CPU umožní vaší aplikaci používat pracovní vlákna pro úlohy náročné na CPU, jako je kryptografie a zpracování obrazu.
Nejčastější dotazy
Co způsobuje chybu nedostatku paměti haldy JavaScriptu?
Tato chyba může být způsobena několika důvody;
1. Úniky paměti
2. Nekonečné smyčky
3. Přítomnost mnoha objektů v projektu
4. Přítomnost rozsáhlých datových struktur
Je chyba JavaScript Heap Out of Memory řešitelná?
Ano. Chybu můžete vyřešit pomocí;
1. Přidělení více virtuální paměti Node.js
2. Odstranění úniků paměti
3. Optimalizace kódu
4. Upgrade hardwaru
Jak můžete vyřešit chybu Heap Out of Memory v aplikaci React?
React je jednou z nejpopulárnějších knihoven JavaScriptu. Vyhledejte soubor package.json v kořenovém adresáři a tyto řádky do sekce skriptů;
"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" }
Zabalit se
Většina vývojářů je při spouštění svých programů Node.js zvyklá na chyby a chyby v kódu, nikoli na chyby za běhu. Naštěstí se nemusíte bát, protože chyba s nedostatkem paměti je opravitelná. Definovali jsme, co je chyba nedostatku paměti v JavaScriptu, vysvětlili jsme, jak ji vyřešit a jak se jí vyhnout ve vašem příštím projektu Node.js.
Dále si také můžete přečíst, jak se vyhnout některým běžným chybám JavaScriptu.