Како да поправите грешку „ЈаваСцрипт хрпа без меморије“

ЈаваСцрипт се и даље истиче као један од најкоришћенијих програмских језика, захваљујући својој прилагодљивости. За развој ЈаваСцрипт апликација изван веб прегледача, неопходно је инсталирати Ноде.јс, што представља вишеплатформско окружење за извршавање.

Честа појава приликом рада са ЈаваСцрипт Ноде.јс пројектима је грешка недостатка меморије.

Проблем преливања меморије у ЈаваСцрипт-у настаје када унапред додељена меморија у рачунарском систему није довољна за покретање обимног пројекта.

У случају да наиђете на грешку мањка меморије, ваш програм ће се принудно затворити, при чему ће се приказати следећи излаз:

ФАТАЛНА ГРЕШКА: CALL_AND_RETRY_LAST Алокација није успела – ЈаваСцрипт хрпа без меморије

Или

Фатална грешка: неважећа алокација величине табеле није успела – јавасцрипт хрпа без меморије

Могући узроци грешке „ЈаваСцрипт хрпа без меморије“

  • Присуство обимних структура података: Операције са гломазним структурама података попут матрица или низова могу заузети значајан меморијски простор, што на крају може довести до грешке преливања меморије.

Ево примера гломазне структуре података са милијарду елемената:

let array = [];

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

    array.push(i);

}
  • Неадекватно управљање меморијом: Са порастом комплексности апликације, неопходно је ослободити објекте који више нису потребни.

Испод је пример функције која доводи до цурења меморије:

let array = [];

setInterval(function() {

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

}, 1000);
  • Бесконачне петље: Код у бесконачној петљи се извршава непрекидно јер услов за прекид никада није испуњен.

Ово је пример бесконачне петље која се извршава без прекида:

while (true) {

    console.log(1);

}

Бесконачне петље могу врло брзо изазвати грешку прекомерног коришћења меморије.

  • Рекурзивне функције: Рекурзивна функција је она која себе позива, директно или индиректно, ради понављања одређеног скупа инструкција док се не испуне одређени услови. Ако се ове функције лоше имплементирају, вероватно ће изазвати цурење меморије и, евентуално, грешке преливања меморије.
  • Превелик број објеката у коду: Ако ваш код садржи велики број обимних објеката, њихова укупна потрошња меморије може изазвати преоптерећење.

Како отклонити грешку „ЈС хрпа без меморије“

Ова грешка се може појавити на оперативним системима заснованим на Виндовс, мацОС и Линук-у, укључујући Убунту. Срећом, грешка је поправљива без обзира на оперативни систем.

#1. Решавање грешке „ЈаваСцрипт хрпа без меморије“ на Виндовс ОС-у

Корак 1: Кликните на Старт мени и потражите „Напредне системске поставке“.

Корак 2: У доњем левом углу дијалог-прозора кликните на „Променљиве окружења“.

Корак 3: Кликните на „Ново“ под „Корисничке променљиве“ или „Системске променљиве“. Прва опција примењује промене на тренутни кориснички налог, док друга примењује промене на цео систем.

Корак 4: Појавиће се две опције; у поље за име променљиве унесите „NODE_OPTIONS“ а у поље за вредност променљиве унесите „–max-old-space-size=4096“. У овом кораку, број 4096 додељује 4 ГБ виртуелне меморије за Ноде.јс. Можете доделити и више, на пример 8 ГБ, постављајући вредност на „–max-old-space-size=8192“.

Корак 5: Кликните „У реду“, „Примени“ и на крају „У реду“ да бисте сачували промене.

Такође, грешку можете решити користећи Виндовс ПоверСхелл терминал. Отворите терминал и унесите следећу команду:

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

Такође, грешку можете привремено решити извршавањем следеће команде пре покретања апликације:

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

#2. Решавање грешке „ЈаваСцрипт хрпа без меморије“ на Линук-у

  • Корак 1: Утврдите узрок грешке. Проверите конзолу или излаз да бисте идентификовали линије кода/датотеке које изазивају грешку.
  • Корак 2: Извезите променљиву окружења која одређује виртуелну меморију додељену за Ноде.јс. Користите следећу команду:
export NODE_OPTIONS=--max-old-space-size=4096

Ови кораци ће доделити 4 ГБ виртуелне меморије за Ноде.јс. Ако грешка и даље постоји, можете повећати величину додељене меморије удвостручавањем.

На пример, ако желите да доделите 8 ГБ виртуелне меморије, можете извршити следећу команду:

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

#3. Решавање грешке „ЈаваСцрипт хрпа без меморије“ на мацОС-у

Грешку „ЈаваСцрипт хрпа без меморије“ на мацОС-у можете отклонити користећи сличан приступ као на Линук-у. Пратите ове кораке:

  • Корак 1: Идентификујте узрок грешке проверавањем конзоле или излаза да бисте утврдили линије кода/датотеке које узрокују грешку.
  • Корак 2: Извезите променљиву окружења која одређује виртуелну меморију коју сте доделили Ноде.јс. Користите следећу команду:
export NODE_OPTIONS=--max-old-space-size=4096

Ови кораци ће доделити 4 ГБ виртуелне меморије за Ноде.јс. Ако грешка и даље постоји, можете повећати величину додељене меморије удвостручавањем.

На пример, ако желите да доделите 8 ГБ виртуелне меморије, можете извршити следећу команду:

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

Повећање меморије током инсталације НПМ-а

Досадашња решења су примењива на грешке које се појављују при покретању Ноде.јс апликације. Међутим, можете доделити виртуелну меморију за решавање грешака мањка меморије током инсталације ЈаваСцрипт пакета. Користите следећу команду:

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

Напомена: Можете наставити да повећавате доделу виртуелне меморије за 1 ГБ, 2 ГБ, 3 ГБ или 4 ГБ. Величина меморије се мора навести у МБ. Ипак, не додељујте сву расположиву меморију машине за Ноде.јс, јер то може довести до пада вашег програма. Као добра пракса, ако ваша машина има 16 ГБ, можете доделити до 8 ГБ за Ноде.јс.

Превенција грешке „ЈаваСцрипт хрпа без меморије“

До сада смо говорили о томе како поправити грешку у ЈаваСцрипт-у када се појави. Срећом, можете предузети мере да спречите појаву ове грешке током извршавања ЈаваСцрипт кода. Ово су неки од најбољих приступа:

#1. Поделите податке на мање делове

Можда имате Ноде.јс програм који увози велике скупове података из обимних ЦСВ датотека кроз ЕТЛ: Екстрацт – Трансформ – Лоад процес. Вероватно ћете установити да ваша апликација пада када покушате да увезете податке. Ако радите са МонгоДБ-ом, грешку можете решити помоћу наредбе командне линије попут:

split -l 1000000 users.csv

Ова команда налаже Ноде.јс да подели датотеку „users“ у више датотека, свака са по 1.000.000 корисника. Ознака -л означава да се датотека дели на основу броја линија кода.

#2. Праћење потрошње меморије

Можете користити профилер меморије да бисте открили цурења меморије у вашем коду. Заједно можете користити уграђене функције меморије Ноде.јс и ЦхромеДевТоолс. Ова два алата могу открити проблеме у вашем коду и помоћи вам да их решите.

Такође можете користити спољне алате као што су Датадог, Нев Релиц и АппДинамицс за праћење перформанси ваше апликације и предузимање потребних акција. Можете такође проверити употребу меморије у вашој Ноде.јс апликацији користећи метод process.memoryUsage().

#3. Избегавање цурења меморије

Цурење меморије се дешава када ваша Ноде.јс апликација задржава референце на објекте који јој више нису потребни. Ако се такви објекти не прикупе као смеће, потрошња меморије ће се временом повећати.

Постоји неколико приступа за избегавање цурења меморије, као што је избегавање глобалних променљивих у коду, избегавање блокирања И/О операција и коришћење кључних речи `let` и `const` приликом декларисања променљивих уместо `var`.

#4. Креирање процеса

Ако користите Ноде.јс на машини са ограниченом меморијом, као што је Распберри Пи, вероватно ћете се сусрести са грешкама преливања меморије. Можете имати један главни процес, а остале груписати као раднике. Када главни процес утврди да систему недостаје меморије, прекида тај процес и додељује задатак другом који није преоптерећен.

#5. Надоградња хардвера

Ако повећање доделе меморије и претходно наведени процеси за спречавање грешке преливања меморије не решавају ваш проблем, размислите о надоградњи хардвера. Ноде.јс може радити са РАМ-ом од само 512 МБ. Међутим, ваша апликација ће захтевати више РАМ-а како расте.

Са друге стране, повећање броја ЦПУ-а такође може побољшати доделу меморије. Идеално, 2 или више ЦПУ-а омогућаваће вашој апликацији да користи радне нити за задатке који захтевају велику процесорску моћ, попут криптографије и обраде слика.

Често постављана питања

Шта изазива грешку „ЈаваСцрипт хрпа без меморије“?

Ова грешка може бити узрокована из више разлога:
1. Цурење меморије
2. Бесконачне петље
3. Велики број објеката у пројекту
4. Обимне структуре података

Да ли је грешка „ЈаваСцрипт хрпа без меморије“ решлива?

Да. Грешку можете решити путем:
1. Додељивања више виртуелне меморије за Ноде.јс
2. Уклањања цурења меморије
3. Оптимизације кода
4. Надоградње хардвера

Како можете да решите грешку недостатка меморије у Реацт апликацији?

Реацт је једна од најпопуларнијих ЈаваСцрипт библиотека. Пронађите датотеку `package.json` у основном директоријуму и додајте ове линије у одељак `scripts`:

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

}

Закључак

Већина програмера је навикла на грешке у коду, али не на грешке током извршавања својих Ноде.јс програма. Срећом, не треба да бринете јер је грешка „хрпа без меморије“ поправљива. Дефинисали смо шта је грешка „ЈаваСцрипт хрпа без меморије“, објаснили како је решити и како је избећи у следећем Ноде.јс пројекту.

Затим можете прочитати како избећи неке честе грешке у ЈаваСцрипт-у.