如何监视Node.js的内存使用情况?


Answers:


66

node-memwatch:检测并查找Node.JS代码中的内存泄漏。查看本教程,以跟踪Node.js中的内存泄漏


1
node-memwatch似乎不再活跃(最新更新于2013年3月)。有其他选择吗?
Golo Roden 2015年

6
@GoloRoden npm install memwatch-next工作正常。这是存储库:github.com/marcominetti/node-memwatch
fre2ak

更是最新的资源,追捕内存泄漏apmblog.dynatrace.com/2015/11/04/...
saintedlama

22
memwatch不再维护,并且不能在最新版本的节点上运行,因此也不必理会。
迈克(Mike)


153

内置的流程模块提供了一种方法memoryUsage,可以洞悉当前Node.js流程的内存使用情况。这是来自64位系统上的Node v0.12.2中的示例:

$ 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 }

在这个简单的示例中,您可以看到为10M个元素的使用者分配了大约80MB的数组(请参阅参考资料heapUsed)。
如果看一下V8的源代码(Array::NewHeap::AllocateRawFixedArrayFixedArray::SizeFor),那么你将看到由阵列中使用的存储器是一个固定值加上长度乘以一个指针的大小。在64位系统上,后者为8个字节,这确认观察到的8 x 10 = 80MB的内存差异是合理的。


1
@MestreSan --expose-gcgc功能不需要哪个版本的Node ?
罗布W

1
@MestreSan我从来没有说过,你需要--expose-gcprocess.memoryUsage()gc()(要求--expose-gc)用于确定性地触发垃圾收集,以使其更易于查看process.memoryUsage报告内容。
罗布W

这是以正确的方式衡量JS-Stuff的绝佳答案。谢谢您的回答。
Suther 15:35

您曾与这个主人一起工作。我刚刚意识到调用过程公开的所有方法,这将帮助我创建一个更高效的应用程序。谢谢。
安德鲁

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命令。
Ingwie Phoenix

3
htop在Linux上使用而不是top。好多了
瑞安·希灵顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.