Как отслеживать использование памяти Node.js?

114

Как я могу отслеживать использование памяти Node.js?

fsiaonma
источник
4
Может быть полезно немного больше деталей
Wottensprels

Ответы:

66

node-memwatch : обнаруживайте и находите утечки памяти в коде Node.JS. Проверьте это руководство по отслеживанию утечек памяти в Node.js

Дамодаран
источник
1
node-memwatch, похоже, больше не работает (последнее обновление в марте 2013 г.). Есть ли альтернативы?
Голо Роден,
6
@GoloRoden npm install memwatch-next отлично работает. Вот репо: github.com/marcominetti/node-memwatch
fre2ak
Более современный ресурс для поиска утечек памяти apmblog.dynatrace.com/2015/11/04/…
saintedlama 01
22
memwatch больше не поддерживается и не будет работать с последней версией узла, так что даже не беспокойтесь.
Майк
153

Во встроенном модуле процесса есть метод, memoryUsageкоторый позволяет получить представление об использовании памяти текущим процессом Node.js. Вот пример из Node v0.12.2 в 64-битной системе:

$ node --expose-gc
> process.memoryUsage();  // Initial usage
{ rss: 19853312, heapTotal: 9751808, heapUsed: 4535648 }
> gc();                   // Force a GC for the baseline.
undefined
> process.memoryUsage();  // Baseline memory usage.
{ rss: 22269952, heapTotal: 11803648, heapUsed: 4530208 }
> var a = new Array(1e7); // Allocate memory for 10m items in an array
undefined
> process.memoryUsage();  // Memory after allocating so many items
{ rss: 102535168, heapTotal: 91823104, heapUsed: 85246576 }
> a = null;               // Allow the array to be garbage-collected
null
> gc();                   // Force GC (requires node --expose-gc)
undefined
> process.memoryUsage();  // Memory usage after GC
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4528072 }
> process.memoryUsage();  // Memory usage after idling
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4753376 }

В этом простом примере вы можете увидеть, что при выделении массива из 10 миллионов элементов-потребителей примерно 80 МБ (взгляните на heapUsed).
Если вы посмотрите на исходный код V8 ( в Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), то вы увидите , что память используется массив является фиксированное значение плюс длина умножается на размер указателя. Последний составляет 8 байт в 64-битной системе, что подтверждает, что наблюдаемая разница памяти в 8 x 10 = 80 МБ имеет смысл.

Роб В
источник
1
@MestreSan Какая версия Node не нужна --expose-gcдля этой gcфункции?
Rob W
1
@MestreSan Я никогда не говорил , что вам нужно --expose-gcдля process.memoryUsage(). gc()(Требование --expose-gc) использовалось в ответе для детерминированного запуска сборки мусора, чтобы упростить просмотр process.memoryUsageотчетов.
Rob W
Это отличный ответ для правильного измерения JS-Stuff. Спасибо за такой ответ.
suther
Вы сделали с этим лорды работу. Я просто реализовал все методы, представленные при вызове процесса, который поможет мне создать более эффективное приложение. Спасибо.
Эндрю
40

Кроме того, если вы хотите знать глобальную память, а не процесс узла:

var os = require('os');

os.freemem();
os.totalmem();

См. Документацию

Voy
источник
1
Однако freemem () - это не то же самое, что доступная память на сервере. Любой способ найти доступную память, а не свободную?
Alex
28

Оригинальный memwatch практически мертв. Вместо этого попробуйте memwatch-next , который, похоже, хорошо работает в современных версиях Node.

Joel
источник
2
Король мертв; Да
Фрэнк Мёленаар,
5

В Linux / Unix (примечание: Mac OS - это Unix) используйте topи нажмите M ( Shift+ M), чтобы отсортировать процессы по использованию памяти.

В Windows используйте диспетчер задач.

Робин Грин
источник
@majidarif Зайдите на, Applications > Utilitiesи вы найдете Activity Monitorприложение. Это эквивалент диспетчера задач. OS X также имеет topкоманду.
Ингви Феникс,
3
используйте htopвместо top в Linux. Это гораздо лучше.
Райан Шиллингтон