如何监视Node.js的内存使用情况?
我如何监视Node.js的内存使用情况?
node-memwatch :检测并查找Node.JS代码中的内存泄漏。 查看本教程跟踪Node.js中的内存泄漏
内置的进程模块有一个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::New
, Heap::AllocateRawFixedArray
, FixedArray::SizeFor
),那么你会看到一个数组使用的内存是一个固定值加上长度乘以一个指针的大小。 后者是64位系统上的8个字节,这证实观察到的8×10 = 80MB的内存差异是有意义的。
原来的memwatch实质上已经死了。 尝试使用memwatch-next ,这似乎在现代版本的Node上运行良好。
另外,如果你想知道全局内存而不是节点进程:
var os = require('os'); os.freemem(); os.totalmem();
见文件
在Linux / Unix上(注意:Mac OS X是一个Unix)使用top
,然后按M(shift + M)按内存使用情况对进程进行sorting。
在Windows上使用任务pipe理器。