Я постоянно развертываю сервер API Node.js.Использование памяти работающим процессом растет по мере развертывания новых версий службы, несмотря на минимальные изменения кода и зависимостей.Кроме того, использование памяти не одинаково в аналогичных средах, несмотря на то, что они имеют одинаковый код и версию Node.js (v8.12.0
) и аналогичное использование и время безотказной работы.
Например, в одной более старой среде сервер APIпосле перезапуска используется ~ 600 МБ, а в другой более молодой, но идентичной среде - после перезапуска ~ 370 МБ.
Чтобы исследовать использование памяти, я сделал снимок кучи с помощью Chrome Dev Tools.Сводка показала, что куча была около 88% строк:
Глядя на ~ 900k строк в снимке, подавляющее большинство из них, кажется, строки, содержащие старые версиикода сервера API:
Как видно из названия файла в разделе сведений внизу, эта строка является полным кодом очень старой версии исходного файла.Существуют сотни версий (казалось бы, всех) старых исходных файлов.Эти файлы были удалены с сервера во время процесса выпуска, но каким-то образом оказались в куче процесса API.
Я попытался запустить процесс с уменьшенным --max-old-space-size
, и это вызывает сбой программы во время ееначинается.
Я не могу определить, каким образом / почему предыдущий исходный код заканчивается строками в куче процесса.Я использую каталог с символической ссылкой current
, который указывает на последнюю версию.Возможно, также уместно, что я использую babel для переноса нашего исходного кода (когда-то давно для async / await, теперь для импорта ES6).
Почему Node.js добавляет старые исходные файлы в виде строк в кучу икак я могу предотвратить это?