Як контролювати використання пам'яті 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

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 х 10 = 80 МБ має сенс.


1
@MestreSan Яка версія Node не потрібна --expose-gcдля gcфункції?
Роб Ш

1
@MestreSan Я ніколи не говорив , що вам потрібно --expose-gcдля process.memoryUsage(). gc()(вимагає --expose-gc) було використано у відповіді з метою детермінованого запуску збору сміття, щоб було легше зрозуміти, які process.memoryUsageзвіти.
Роб Ш

Це дивовижна відповідь, щоб правильно виміряти JS-Stuff. Дякую за відповідь
суть

Ви робили лорди з цим. Я просто зрозумів, що всі методи, виявлені методом виклику, допоможуть мені створити більш ефективну програму. Дякую.
Андрій

40

Крім того, якщо ви хочете знати глобальну пам'ять, а не процес вузла ":

var os = require('os');

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

Дивіться документацію


1
Однак freemem () не є таким, як наявна пам'ять на сервері. Будь-який спосіб знайти доступну пам'ять, а не безкоштовну?
Олексій


5

У Linux / Unix (примітка: Mac OS - це Unix) використовуйте topта натисніть M ( Shift+ M) для сортування процесів за допомогою використання пам'яті.

У Windows використовуйте диспетчер завдань.


@majidarif Перейдіть Applications > Utilitiesі ви знайдете Activity Monitorдодаток. Цей еквівалент диспетчера завдань. У OS X також є topкоманда.
Ingwie Phoenix

3
використовувати htopзамість верху на Linux. Це набагато краще.
Райан Шиллінгтон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.