javascript - 监控 Node.js 进程中的最大内存消耗

标签 javascript node.js profiling

我正在寻找一种跨平台的方法来可靠地监控 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/

相关文章:

javascript - 变量中只允许两个单词,但允许破折号

javascript - Google+ 使用 JavaScript 登录——立即调用两次回调

javascript - 尝试 POST 时无法从请求正文获取对象的值 [Node.js、MySQL]

javascript - 自动完成完成后隐藏输入字段

javascript - 对jQuery进行性能分析,如何使我的应用程序更生动?

c++ - Visual C++ 2005 探查器

javascript - 是否有任何实际理由对 JSON 键使用带引号的字符串?

javascript - 使用 lodash 获取对象值的子集作为管道分隔字符串

javascript - 当promise解析时如何重新渲染React组件? |如何阻止渲染直到数据加载?

c++ - 分析 ZeroMQ