我正在寻找一种跨平台的方法来可靠地监控 Node.js 进程中的最大内存消耗,无论是否存在泄漏。
在我的案例中,流程既是真实的应用程序,也是综合测试。
我希望它能像这样工作
process.on('exit', () => {
console.log('Max memory consumption: ' + ...);
});
可以使用 node --trace_gc ...
以某种方式跟踪内存消耗,但这导致输出难以读取(并且可能难以以编程方式分析)。此外,即使 RAM 使用量很大,脚本结束过快也不会发生 GC。
根据我在该主题上看到的情况,通常建议使用 memwatch
,例如:
require('memwatch-next').on('stats', stats => {
console.log('Max memory consumption: ' + stats.max);
});
但在我的情况下,它仅在 GC 已经发生或根本没有触发时触发,因此它对于确定 RAM 消耗峰值是无用的。
如果可能的话,我宁愿避免使用像 node-inspector
这样的 GUI 工具。
能否从应用程序本身或单独的 CLI 跨平台可靠地检索此最大内存消耗作为数字?
最佳答案
您可以使用 Node.js 的 process.memoryUsage()
方法来获取内存使用情况:
The process.memoryUsage() method returns an object describing the memory usage of the Node.js process measured in bytes.
它返回以下格式的对象:
{
rss: 4935680, // Resident Set Size
heapTotal: 1826816, // Total Size of the Heap
heapUsed: 650472, // Heap actually Used
external: 49879 // memory usage of C++ objects bound to JavaScript objects managed by V8
}
为了获得Node.js进程的最大内存消耗,可以使用process.nextTick
方法。 process.nextTick()
方法将回调添加到next tick queue。一旦事件循环的当前轮次运行完成,当前在下一个滴答队列中的所有回调都会被调用。
let _maxMemoryConsumption = 0;
let _dtOfMaxMemoryConsumption;
process.nextTick(() => {
let memUsage = process.memoryUsage();
if (memUsage.rss > _maxMemoryConsumption) {
_maxMemoryConsumption = memUsage.rss;
_dtOfMaxMemoryConsumption = new Date();
}
});
process.on('exit', () => {
console.log(`Max memory consumption: ${_maxMemoryConsumption} at ${_dtOfMaxMemoryConsumption}`);
});
关于javascript - 监控 Node.js 进程中的最大内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44829364/