Answers:
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 x 10 = 80MB的内存差异是合理的。
--expose-gc
该gc
功能不需要哪个版本的Node ?
--expose-gc
的process.memoryUsage()
。gc()
(要求--expose-gc
)用于确定性地触发垃圾收集,以使其更易于查看process.memoryUsage
报告内容。
原始的memwatch本质上已经死了。尝试使用memwatch-next,它在现代版本的Node上似乎运行良好。
在Linux / Unix(请注意:Mac OS是Unix)上top
,然后按M(Shift+M)按内存使用量对进程进行排序。
在Windows上,使用任务管理器。
Applications > Utilities
,您将找到一个Activity Monitor
应用程序。那相当于任务管理器。OS X也具有该top
命令。
htop
在Linux上使用而不是top。好多了