node.js process.memoryUsage()的返回值代表什么?

时间:2012-08-19 00:45:59

标签: node.js v8

从官方文档(source):

  

process.memoryUsage()

     

返回描述Node进程的内存使用情况的对象   以字节为单位。

var util = require('util');

console.log(util.inspect(process.memoryUsage()));
     

这将产生:

{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }
     

heapTotal和heapUsed是指V8的内存使用情况。

究竟 rss heapTotal heapUsed 代表什么?

这似乎是一个微不足道的问题,但我一直在寻找,到目前为止我找不到明确的答案。

4 个答案:

答案 0 :(得分:113)

为了回答这个问题,首先要了解V8的记忆方案。

正在运行的程序总是通过内存中分配的一些空间来表示。此空间称为常驻设置。 V8使用类似于Java虚拟机的方案,并将内存划分为多个段:

  • 代码:正在执行的实际代码
  • 堆栈:包含所有值类型(基本体,如整数或布尔值),其中指针引用堆上的对象,指针定义程序的控制流程
  • :专门用于存储对象,字符串和闭包等引用类型的内存段。 enter image description here

现在很容易回答这个问题:

  • rss :居民设置尺寸
  • heapTotal :堆的总大小
  • heapUsed :实际使用堆

参考http://apmblog.dynatrace.com/2015/11/04/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/

答案 1 :(得分:37)

RSS resident set size,进程内存中保存在RAM中的部分(与交换空间或文件系统中保存的部分相对)。

是新分配对象来自的内存部分(想想C中的malloc或JavaScript中的new)。

您可以在Wikipedia了解有关堆的更多信息。

答案 2 :(得分:1)

让我们举一个例子

下面的示例将向您展示内存使用量的增加实际上如何增加rssheapTotal

const numeral = require('numeral');
let m = new Map();
for (let i = 0; i < 100000; i++) {
    m.set(i, i);
    if (i % 10000 === 0) { 
        const { rss, heapTotal } = process.memoryUsage();
        console.log( 'rss', numeral(rss).format('0.0 ib'), heapTotal, numeral(heapTotal).format('0.0 ib') )
    } 
}

运行上面将为您提供以下信息:

rss 22.3 MiB 4734976 4.5 MiB
rss 24.2 MiB 6483968 6.2 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 32.8 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB

这清楚地向您展示了如何使用变量并不断增加其所需的空间来增加heapTotal并相应地增加常驻集大小(rss

答案 3 :(得分:0)

Node.js doumentation对其描述如下:

  

heapTotal和heapUsed 是指V8的内存使用情况。 外部是指   C ++对象绑定到JavaScript对象管理的内存使用情况   V8 rss,居民集大小,是   主内存设备(是总分配内存的子集)   该过程包括堆,代码段和堆栈。

所有提及的值均以字节表示。因此,如果只想打印它们,则可能希望将它们重新缩放为MB:

const used = process.memoryUsage();
for (let key in used) {
  console.log(`Memory: ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}

这将为您提供如下输出:

Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB