На этой странице

В этом документе вы узнаете, как отлаживать проблемы, связанные с памятью.

Node.js (JavaScript) — язык со сборкой мусора, поэтому утечки памяти возможны через удерживающие ссылки (retainers). Поскольку приложения на Node.js обычно многопользовательские (multi-tenant), бизнес-критичные и долгоживущие, обеспечение доступного и эффективного способа найти утечку памяти существенно важно.

Можно также тонко настраивать память для получения конкретных результатов. Подробнее см. Понимание и тонкая настройка памяти.

Пользователь наблюдает непрерывно растущее использование памяти (быстро или медленно, на протяжении дней или даже недель), затем видит, как процесс падает и перезапускается менеджером процессов. Процесс, возможно, работает медленнее, чем раньше, и перезапуски приводят к сбою части запросов (балансировщик нагрузки отвечает 502).

  • Перезапуски процесса из-за исчерпания памяти, и запросы «роняются на пол» (dropped on the floor)
  • Повышенная активность GC ведёт к более высокому использованию CPU и более медленному времени отклика
    • GC блокирует Event Loop, вызывая замедление
  • Повышенный своп (swapping) памяти замедляет процесс (активность GC)
  • Может не хватить доступной памяти, чтобы получить Heap Snapshot

Приложение использует неожиданный объём памяти, и/или мы наблюдаем повышенную активность сборщика мусора.

  • Повышенное число ошибок страниц (page faults)
  • Более высокая активность GC и использование CPU

Большинство проблем с памятью можно решить, определив, сколько места занимает наш конкретный тип объектов и какие переменные не дают им быть собранными сборщиком мусора. Также может помочь знание паттерна аллокаций нашей программы во времени.