#Что означает ошибка
heap out of memory
V8 ограничивает размер «кучи» для старых объектов: по умолчанию от 2 до 4 ГБ на 64-битных системах (зависит от версии Node и объёма ОЗУ; в Node 12+ лимит вычисляется по доступной памяти). Когда программа держит в памяти больше данных, чем помещается, Node завершается с ошибкой heap out of memory. Типичные сценарии: сборка большого фронтенда (webpack, Vite, Next.js), чтение огромных файлов целиком, накапливающиеся в памяти кэши, утечки.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Малый лимит памятиЛимит по умолчанию меньше, чем нужно сборке. | Падение при npm run build на большом проекте. | Увеличьте --max-old-space-size. |
| Утечка памятиОбъекты накапливаются и не освобождаются. | Память растёт со временем, процесс «пухнет». | Найдите утечку через профилировщик. |
| Большие данныеЗагрузка гигантского JSON или файла целиком. | fs.readFile на файле в несколько ГБ. | Читайте потоками (stream). |
| Сборка с параллелизмомМного параллельных задач и плагинов. | Падает только на CI с малым объёмом ОЗУ. | Ограничьте параллелизм. |
#Пошаговое решение
- Узнайте текущий лимитОткройте терминал в папке проекта: в VS Code выберите «Терминал → Создать терминал», в Windows можно открыть PowerShell через меню «Пуск». Выполните
node --version, затемnode -e "console.log(Math.round(require('v8').getHeapStatistics().heap_size_limit/1024/1024))". Второе число — лимит кучи V8 в МиБ, а не вся доступная оперативная память. Сравните его с объёмом ОЗУ в «Диспетчере задач → Производительность → Память» (Windows) или с данными системы. Еслиnodeне найден, сначала проверьте установку Node.js и путь PATH. - Увеличьте лимитЕсли ошибка возникла во время сборки
npm run build, сохраните результаты работы и в терминале проекта временно увеличьте лимит только для этого запуска. Linux/macOS:NODE_OPTIONS=--max-old-space-size=4096 npm run build; PowerShell:$env:NODE_OPTIONS='--max-old-space-size=4096'; npm run build. Значение 4096 — пример для машины с достаточной свободной памятью; на компьютере с 4 ГиБ ОЗУ использовать его неразумно. При успешной сборке проблема была в ограничении кучи; при аварийном завершении ОС проверьте суммарную память контейнера и систему подкачки, а не увеличивайте число снова. - Зафиксируйте в package.jsonЕсли приложение регулярно требует больший лимит и измерения показывают, что памяти достаточно, согласуйте изменение команды запуска с разработчиком. Откройте
package.jsonи найдите разделscripts: установитеNODE_OPTIONSперед запуском через сценарий среды (например,cross-envкак отдельную установленную зависимость), либо запустите точный JS-файл командойnode --max-old-space-size=4096 путь/к/файлу.js. Не подставляйтеnode_modules/vite/bin/vite.jsдля любого сборщика: расположение исполняемого файла зависит от версии. Проверьте, что обычная сборка снова работает и значение ограничено только нужным процессом. - Найдите утечкуЕсли объём памяти растёт при длительной работе сервера, исследуйте утечку, а не повышайте лимит бесконечно. В копии проекта или безопасном испытательном окружении запустите
node --inspect app.js, заменивapp.jsреальной точкой входа. В Chrome откройтеchrome://inspect, выберите процесс Node.js → «Inspect» → вкладка Memory, сделайте снимки кучи до и после повторения сценария. Сравните удерживаемые объекты. Не публикуйте отладочный порт в Интернет и не подключайте инспектор к чужому рабочему процессу; при отсутствии разрешения передайте разработчику журналы и шаги воспроизведения. - Обрабатывайте данные потокамиЕсли ошибка возникает при чтении большого файла, откройте в проекте участок, где используются
readFileSync,readFileили собирается огромный массив, и проверьте, не загружаются ли все данные целиком. Для построчной обработки текста используйтеcreateReadStreamвместе сreadline, для передачи данных — потоковую обработку с контролем ошибок. Сначала испытайте изменение на небольшой копии файла и сравните результат; строки с многобайтными символами нельзя произвольно разрезать по байтам. Если код не ваш, сообщите разработчику путь к файлу и объём обрабатываемых данных. - Ограничьте параллелизмЕсли ошибка появляется лишь во время сборки или тестов с множеством процессов, проверьте число одновременно запускаемых задач в конфигурации именно вашего инструмента. Для Jest найдите параметр
maxWorkersи попробуйте ограничить число работников; для Webpack проверьте документацию поparallelism, если этот параметр поддерживается в вашей конфигурации. Изменение TypeScriptincrementalсамо по себе не гарантирует уменьшения потребления памяти. После каждого отдельного изменения запустите прежнюю команду и зафиксируйте длительность и пиковое потребление; не смешивайте несколько настроек одновременно. - Обновите Node.jsПроверьте поддерживаемую проектом версию Node.js: посмотрите
.nvmrc, полеenginesвpackage.jsonи руководство к сборщику. При несовместимости установите подходящую поддерживаемую версию через официальный установщик или выбранный менеджер версий и переоткройте терминал. Выполнитеnode --version, повторите сборку и убедитесь, что результат воспроизводится. Если даже при достаточном лимите размер кучи растёт без остановки, верните прежнюю версию/настройки и оформите сообщение об утечке с журналом ошибки и измерениями. - Первая и вторая команды — только проверкаLinux · Терминал (Bash)КомандаПервая и вторая команды — только проверка. Последняя — отдельный вариант запуска для Linux/macOS, НЕ вводите её в PowerShell. Для PowerShell см. шаг 2.
node --versionnode -e "console.log(Math.round(require('v8').getHeapStatistics().heap_size_limit/1024/1024))"# Linux/macOS, только в терминале проекта при достаточной ОЗУ:NODE_OPTIONS=--max-old-space-size=4096 npm run build
Если сборка падает в Docker/CI, проверьте лимит памяти контейнера: Node не знает о cgroup-лимите в старых версиях, и ядро убивает процесс (OOM killer) раньше, чем V8 сообщит об ошибке (Killed в выводе). Используйте docker stats и увеличьте память либо включите swap. Подробнее о ключах — в .