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


Ответы:


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();

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


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


5

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

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


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

3
используйте htopвместо top в Linux. Это гораздо лучше.
Райан Шиллингтон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.