Как отслеживать использование памяти 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.