JavaScript, завдяки своїй універсальності, залишається однією з найпопулярніших мов програмування. Для виконання JavaScript-коду поза браузером, розробникам необхідно встановити Node.js, міжплатформне середовище виконання.
Під час роботи над проєктами на Node.js, часто виникає помилка, пов’язана з нестачею пам’яті “В купі JavaScript не вистачає пам’яті”.
Ця проблема виникає, коли обсяг пам’яті, виділений системою за замовчуванням, виявляється недостатнім для запуску ресурсомісткого проєкту.
У випадку появи помилки, пов’язаної з нестачею пам’яті, ваша програма аварійно завершить роботу, виводячи повідомлення:
ФАТАЛЬНА ПОМИЛКА: не вдалося розподілити CALL_AND_RETRY_LAST – пам’ять у купі JavaScript
або
Фатальна помилка: недійсний розподіл розміру таблиці не вдалося – пам’ять у купі JavaScript вичерпана
Причини виникнення помилки нестачі пам’яті в JavaScript
- **Обробка великих обсягів даних:** Використання великих структур даних, таких як багатовимірні масиви або матриці, може зайняти значну частину пам’яті, що може призвести до помилки “нестачі пам’яті”.
Наприклад, ось фрагмент коду, що створює масив з мільярдом елементів:
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); }
Нескінченні цикли швидко вичерпують доступну пам’ять, що призводить до помилки.
- **Рекурсивні функції:** Якщо рекурсивна функція викликає себе без коректних умов завершення, це може призвести до переповнення стеку викликів та витоку пам’яті.
- **Надмірна кількість об’єктів:** Велика кількість великих об’єктів у коді може сумарно вимагати забагато пам’яті.
Виправлення помилки нестачі пам’яті в JavaScript
Ця помилка може виникати в різних операційних системах, включаючи Windows, macOS та Linux (наприклад, Ubuntu). На щастя, існує декілька методів її усунення, незалежно від вашої ОС.
#1. Виправлення помилки нестачі пам’яті в Windows
Крок 1. Відкрийте меню “Пуск” та знайдіть “Додаткові параметри системи”.
Крок 2. Клацніть “Змінні середовища” в нижній лівій частині діалогового вікна.
Крок 3. Натисніть “Створити” у розділі “Змінні користувача” або “Системні змінні”. Перший варіант дозволить застосувати зміни для поточного користувача, а другий – для всієї системи.
Крок 4. Вкажіть ім’я змінної “NODE_OPTIONS” та значення “-max-old-space-size=4096”. Значення “4096” виділяє 4 Гб віртуальної пам’яті для Node.js. Ви можете збільшити це значення, наприклад, до 8 Гб, встановивши “-max-old-space-size=8192”.
Крок 5. Натисніть “OK”, “Застосувати”, а потім “OK” для збереження змін.
Також, для усунення помилки, можна використовувати термінал Windows PowerShell. Відкрийте термінал і введіть команду:
env:NODE_OPTIONS="--max-old-space-size=4096"
Для тимчасового вирішення проблеми, ви можете використовувати команду:
set NODE_OPTIONS=--max-old-space-size=4096
#2. Виправлення помилки “купа пам’яті” в Linux
- Крок 1. Визначте джерело помилки. Перегляньте логи консолі, щоб знайти проблемні рядки коду.
- Крок 2. Експортуйте змінну середовища, яка визначає обсяг віртуальної пам’яті для Node.js за допомогою команди:
export NODE_OPTIONS=--max-old-space-size=4096
Ця команда виділить 4 Гб віртуальної пам’яті. Якщо помилка не зникне, спробуйте подвоїти це значення.
Для виділення 8 Гб віртуальної пам’яті, використовуйте команду:
export NODE_OPTIONS=--max-old-space-size=8192
#3. Виправлення помилки “купа пам’яті” в macOS
Вирішення помилки “купа пам’яті” в macOS схоже на підхід, що використовується в Linux. Виконайте наступні кроки:
- Крок 1. Знайдіть джерело помилки, перевіривши журнали консолі.
- Крок 2. Експортуйте змінну середовища, що визначає обсяг віртуальної пам’яті для Node.js, використовуючи команду:
export NODE_OPTIONS=--max-old-space-size=4096
Це виділить 4 Гб віртуальної пам’яті. За потреби, збільшіть це значення.
Для виділення 8 Гб віртуальної пам’яті, введіть команду:
export NODE_OPTIONS=--max-old-space-size=8192
Збільшення пам’яті під час встановлення NPM
Вищезазначені рішення стосуються помилок під час запуску Node.js програм. Проте, можна також виділити віртуальну пам’ять для вирішення помилок під час встановлення пакетів JavaScript. Використайте наступну команду:
node --max-old-space-size=4096 (which npm) install
Примітка: Збільшуйте обсяг віртуальної пам’яті поступово, на 1-4 Гб. Значення вказується в мегабайтах. Не виділяйте всю пам’ять комп’ютера для Node.js, оскільки це може призвести до збоїв. Якщо у вас 16 Гб оперативної пам’яті, виділіть до 8 Гб для Node.js.
Запобігання помилкам нестачі пам’яті JavaScript
Крім усунення вже існуючих помилок, важливо вживати заходів для їх запобігання. Ось декілька корисних порад:
#1. Розподіл даних на невеликі частини
При обробці великих наборів даних з CSV файлів, розділіть їх на менші частини. Наприклад, при роботі з MongoDB, можна використовувати команду:
split -l 1000000 users.csv
Ця команда розділить файл “users.csv” на окремі файли з 1 000 000 рядків у кожному.
#2. Контроль за використанням пам’яті
Використовуйте профайлери пам’яті, щоб виявити витоки. Поєднуйте вбудовані інструменти Node.js з Chrome DevTools. Можна також використовувати зовнішні інструменти, такі як Datadog, New Relic і AppDynamics. Метод `process.memoryUsage()` дозволяє перевірити використання пам’яті у вашій програмі.
#3. Уникнення витоків пам’яті
Витоки пам’яті виникають, коли програма зберігає посилання на об’єкти, які їй більше не потрібні. Запобігайте витокам, уникаючи глобальних змінних, блокуючих операцій вводу-виводу, та використовуйте `let` і `const` замість `var`.
#4. Використання дочірніх процесів
На комп’ютерах з обмеженою пам’яттю, таких як Raspberry Pi, використовуйте дочірні процеси для розподілу навантаження. Основний процес керує робочими процесами і перерозподіляє завдання при виявленні нестачі пам’яті.
#5. Оновлення обладнання
Якщо запропоновані методи не допомагають, можливо, варто розглянути оновлення обладнання. Node.js може працювати з 512 Мб оперативної пам’яті, але для більших додатків може знадобитися більше. Збільшення кількості процесорних ядер також може покращити продуктивність.
Поширені запитання
Що викликає помилку нестачі пам’яті?
Причинами можуть бути:
1. Витоки пам’яті
2. Нескінченні цикли
3. Надмірна кількість об’єктів
4. Робота з великими структурами даних.
Чи можна виправити помилку нестачі пам’яті?
Так, для цього можна:
1. Виділити додаткову віртуальну пам’ять для Node.js.
2. Усунути витоки пам’яті.
3. Оптимізувати код.
4. Оновити обладнання.
Як виправити помилку нестачі пам’яті в React?
У файлі `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" }
Підсумки
Розробники часто зустрічаються з помилками коду. На щастя, помилки виконання, такі як “нестача пам’яті”, піддаються виправленню. Ми розглянули, що таке помилка нестачі пам’яті JavaScript, способи її виправлення, а також заходи, які допоможуть уникнути її у майбутніх проєктах Node.js.
Додатково, рекомендуємо ознайомитися зі статтями про те, як уникнути типових помилок JavaScript.