Ошибка JavaScript "heap out of memory": причины и как исправить

Почему возникает ошибка “heap out of memory”
Кратко: приложение превысило доступную область кучи JavaScript. Обычно виноваты одна или несколько из перечисленных причин:
- Большие объекты или коллекции, удерживаемые в памяти. Если несколько тяжёлых объектов одновременно находятся в куче, суммарный объём памяти растёт.
- Недостаточно выделено памяти процессу Node.js по умолчанию. По умолчанию V8 ограничивает размер кучи (на 64‑разрядных системах это обычно ~1.4–1.7 ГБ для старых Node.js; точный предел зависит от версии и платформы).
- Утечки памяти: объекты продолжают ссылаться и не подбираются сборщиком мусора.
- Обработка больших структур данных (большие массивы, матрицы, буферы). Плохо оптимизированные операции копирования или map/filter без контроля памяти усугубляют проблему.
- Бесконечные или сильно рекурсивные циклы, генерирующие объекты быстрее, чем сборщик мусора успевает их удалить.
Важно: корректная диагностика начинается с профилирования кучи — «увеличение памяти» решает symptom, но не всегда причину.
Быстрые способы исправить (Windows GUI)
- Откройте Проводник (Windows + E).
- ПКМ на «Этот компьютер» → «Свойства».

- Выберите «Дополнительные параметры системы».

- Во вкладке “Дополнительно” нажмите “Переменные среды”.

- Нажмите “Создать” в разделе системных или пользовательских переменных.

- В поле “Имя переменной” введите:
NODE_OPTIONS. - В поле “Значение переменной” введите:
--max-old-space-size=4096(значение в мегабайтах).
- Нажмите OK, примените изменения и перезапустите командную строку/терминал и, при необходимости, саму систему.
Примечание: вы можете поставить 8192 вместо 4096, если у вашего сервера достаточно физической памяти. Значения указываются в мегабайтах (МБ).
Быстрые способы исправить (PowerShell и CMD)
- PowerShell (только текущая сессия):
$env:NODE_OPTIONS = "--max-old-space-size=4096"- CMD (текущая сессия):
set NODE_OPTIONS=--max-old-space-size=4096- Запуск Node напрямую с флагом (рекомендуется для однократного запуска):
node --max-old-space-size=4096 ./app.js- В package.json в разделе scripts:
"scripts": {
"start": "node --max-old-space-size=4096 ./server.js"
}Эти подходы дают быстрое временное решение: процесс получит больше памяти. Но если причина — утечка, память вновь вырастет со временем.
Диагностика: как найти причину
- Запустите приложение с флагом профилирования:
node --inspect --max-old-space-size=4096 app.js. - Подключитесь через Chrome DevTools (chrome://inspect) и снимите дамп кучи (Heap Snapshot).
- Сравните снимки кучи во времени — ищите объекты, которые накапливаются.
- Используйте инструменты: heapdump, clinic.js (clinic doctor/clinic heapprofile), memwatch-next (с осторожностью — старые модули).
Краткие определения:
- Снимок кучи: снимок всех объектов в памяти в конкретный момент.
- Утечка памяти: ситуация, когда объекты остаются достижимыми и не удаляются сборщиком.
Модель принятия решений (кратко)
flowchart TD
A[Появилась ошибка heap out of memory] --> B{Запуск краткий/локальный или продакшн}
B -->|локальный| C[Увеличить --max-old-space-size и повторить]
B -->|продакшн| D[Снять дамп памяти и профайлить]
C --> E{Ошибка повторяется}
D --> E
E -->|да| F[Найти утечку, оптимизировать алгоритмы, дробить данные]
E -->|нет| G[Оставить увеличенный лимит и мониторить]Альтернативные и дополнительные подходы
- Разбивать большие операции на пакеты (streaming, batching). При обработке больших файлов или массивов читайте/обрабатывайте по кускам.
- Использовать генераторы или стримы вместо создания больших массивов целиком.
- Переписать горячие участки на более экономичные структуры (TypedArray, Buffer) или вынести тяжёлую обработку в отдельный сервис/worker с контролируемым лимитом памяти.
- Горизонтальное масштабирование: запускать несколько процессов с меньшей нагрузкой вместо одного монолита.
Когда увеличение памяти не сработает (когда это стоп‑gap)
- Если в приложении есть реальная утечка — объём памяти будет непрерывно расти.
- Если суммарная память, требуемая приложению, превышает доступный объём ОЗУ на сервере.
- Если проблема в сторонней библиотеке, удерживающей ресурсы — нужно обновление или замена библиотеки.
Мини‑методология устранения проблемы (шаги для инженера)
- Воспроизвести ошибку в контролируемой среде.
- Увеличить лимит памяти для временной проверки (
--max-old-space-size), чтобы убедиться, что ошибка связана с лимитом, а не с неверной конфигурацией. - Снять снимки кучи через inspector и сравнить.
- Локализовать код, удерживающий объекты (по стенам памяти и путям удержания).
- Исправить код (удалять ссылки, использовать слабые коллекции, стримы).
- Написать тесты нагрузочного профиля и мониторить память в продакшне.
Чек‑лист по ролям
Для разработчика:
- Воспроизвести проблему локально
- Сделать heap snapshot
- Проверить массивы/кеши/глобальные объекты
- Оптимизировать алгоритмы и использовать стримы
Для DevOps:
- Проверить свободную ОЗУ на хосте
- При необходимости настроить NODE_OPTIONS для сервисов
- Включить сбор метрик памяти (Prometheus/Grafana)
- Настроить автоперезапуск с ограничениями памяти (systemd/cgroup)
Примеры команд и сниппеты (шпаргалка)
- PowerShell (сессия):
$env:NODE_OPTIONS = "--max-old-space-size=4096"
npm start- CMD (сессия):
set NODE_OPTIONS=--max-old-space-size=4096
npm start- Прямой запуск Node:
node --max-old-space-size=4096 ./dist/index.jsКритерии приёмки
- Ошибка “heap out of memory” более не воспроизводится при реальной нагрузке.
- Память процесса стабилизируется после выполнения задач (пики — допустимы, непрерывный рост — нет).
- Автоматические тесты/нагрузочные сценарии не демонстрируют утечек в течение порогового времени мониторинга.
Тестовые случаи и приёмочные сценарии
- Запустить сценарий обработки большого файла: проверить, что после завершения задача освобождает память.
- Запустить длительный рабочий цикл (например, 1 час): проверить отсутствие линейного роста используемой памяти.
- Проверить падение при искусственном ограничении памяти для симуляции нехватки.
Часто задаваемые вопросы
Что быстрее — увеличивать память или искать утечку?
Увеличение памяти быстрее и даёт временное решение. По‑настоящему устойчивое решение — найти и исправить утечку или оптимизировать обработку данных.
Можно ли ставить очень большие значения, например 65536?
Технически можно, но реальная максимальная полезность ограничена объёмом физической памяти и настройками ОС. Большой лимит скрывает проблему и может привести к свопингу и деградации производительности.
Как контролировать память в продакшне?
Настройте метрики (RSS, heapUsed, heapTotal) через process.memoryUsage() и экспортируйте их в систему мониторинга. Установите алерты на рост памяти и длительные пики.
Итог
Устранение ошибки “heap out of memory” обычно начинается с временного увеличения лимита памяти, но окончательное решение — это диагностика и исправление утечек или оптимизация обработки данных. Используйте профайлинг, снимки кучи и подходы с разбиением данных, чтобы добиться стабильности.
Важно: после изменения NODE_OPTIONS или системных переменных перезапустите нужные службы и терминалы. Если помогли какие‑то шаги из этой инструкции — расскажите о результатах в комментариях или системе отчётности вашей команды.
Похожие материалы
Как устроить идеальную вечеринку для просмотра ТВ
Как распаковать несколько RAR‑файлов сразу
Приватный просмотр в Linux: как и зачем
Windows 11 не видит iPod — способы исправить
PS5: как настроить игровые пресеты