Jak opravit chybu „Hromady nedostatku paměti v JavaScriptu“

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

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í.
  Jak vytvořit trychtýřový graf v Excelu

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.

  Jak číst Wikipedii z plochy Linuxu

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.

  Nejlepší PC optimalizátory pro zrychlení vašeho pomalého počítače

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.