Гид по технологиям

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

5 min read Node.js Обновлено 06 Dec 2025
Ошибка JavaScript heap out of memory — исправление
Ошибка JavaScript heap out of memory — исправление

Ошибка 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)

  1. Откройте Проводник (Windows + E).
  2. ПКМ на «Этот компьютер» → «Свойства». Окно свойств системы для настройки переменных среды
  3. Выберите «Дополнительные параметры системы». Параметры системы — вкладка Дополнительно
  4. Во вкладке “Дополнительно” нажмите “Переменные среды”. Окно Переменные среды
  5. Нажмите “Создать” в разделе системных или пользовательских переменных. Кнопка Создать в Переменных среды
  6. В поле “Имя переменной” введите: NODE_OPTIONS.
  7. В поле “Значение переменной” введите: --max-old-space-size=4096 (значение в мегабайтах). Подтвердить изменения переменных среды
  8. Нажмите 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"
}

Эти подходы дают быстрое временное решение: процесс получит больше памяти. Но если причина — утечка, память вновь вырастет со временем.

Диагностика: как найти причину

  1. Запустите приложение с флагом профилирования: node --inspect --max-old-space-size=4096 app.js.
  2. Подключитесь через Chrome DevTools (chrome://inspect) и снимите дамп кучи (Heap Snapshot).
  3. Сравните снимки кучи во времени — ищите объекты, которые накапливаются.
  4. Используйте инструменты: 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)

  • Если в приложении есть реальная утечка — объём памяти будет непрерывно расти.
  • Если суммарная память, требуемая приложению, превышает доступный объём ОЗУ на сервере.
  • Если проблема в сторонней библиотеке, удерживающей ресурсы — нужно обновление или замена библиотеки.

Мини‑методология устранения проблемы (шаги для инженера)

  1. Воспроизвести ошибку в контролируемой среде.
  2. Увеличить лимит памяти для временной проверки (--max-old-space-size), чтобы убедиться, что ошибка связана с лимитом, а не с неверной конфигурацией.
  3. Снять снимки кучи через inspector и сравнить.
  4. Локализовать код, удерживающий объекты (по стенам памяти и путям удержания).
  5. Исправить код (удалять ссылки, использовать слабые коллекции, стримы).
  6. Написать тесты нагрузочного профиля и мониторить память в продакшне.

Чек‑лист по ролям

  • Для разработчика:

    • Воспроизвести проблему локально
    • Сделать 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 или системных переменных перезапустите нужные службы и терминалы. Если помогли какие‑то шаги из этой инструкции — расскажите о результатах в комментариях или системе отчётности вашей команды.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как устроить идеальную вечеринку для просмотра ТВ
Развлечения

Как устроить идеальную вечеринку для просмотра ТВ

Как распаковать несколько RAR‑файлов сразу
Инструменты

Как распаковать несколько RAR‑файлов сразу

Приватный просмотр в Linux: как и зачем
Приватность

Приватный просмотр в Linux: как и зачем

Windows 11 не видит iPod — способы исправить
Руководство

Windows 11 не видит iPod — способы исправить

PS5: как настроить игровые пресеты
Консоли

PS5: как настроить игровые пресеты

Как переключить камеру в Omegle на iPhone и Android
Руководство

Как переключить камеру в Omegle на iPhone и Android