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

Ошибка 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
Автор
Редакция

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство