如何获得节点进程具有的最大旧空间大小



我正试图找到节点进程的最大旧空间大小。

首先,我尝试使用process.memoryUsage()中的heapTotal,但是:

  1. 这包含整个堆,而不是旧空间的最大大小(请参阅此处了解更多区别(
  2. 我不能每0毫秒运行一次,因为它会错过分配的内存,并且在同步操作(如fs.readFileSync(...)(中会发生垃圾收集

所以我提出的解决方案,我不知道它是否正确:

如果我运行带有v8标志--trace_gc_verbose的节点进程(在每次垃圾收集后打印更多详细信息(,它将输出类似于:

[7515:0x118008000] Memory allocator,       used:   5400 KB, available: 4238056 KB
[7515:0x118008000] Read-only space,        used:    146 KB, available:      0 KB, committed:    148 KB
[7515:0x118008000] New space,              used:    212 KB, available:    810 KB, committed:   2048 KB
[7515:0x118008000] New large object space, used:      0 KB, available:   1022 KB, committed:      0 KB
[7515:0x118008000] Old space,              used:   1914 KB, available:    202 KB, committed:   2204 KB
[7515:0x118008000] Code space,             used:     85 KB, available:      0 KB, committed:    352 KB
[7515:0x118008000] Map space,              used:    275 KB, available:      0 KB, committed:    516 KB
[7515:0x118008000] Large object space,     used:    128 KB, available:      0 KB, committed:    132 KB
[7515:0x118008000] Code large object space,     used:      0 KB, available:      0 KB, committed:      0 KB
[7515:0x118008000] All spaces,             used:   2763 KB, available: 4240091 KB, committed:   5400 KB
[7515:0x118008000] Unmapper buffering 0 chunks of committed:      0 KB
[7515:0x118008000] External memory reported:     21 KB
[7515:0x118008000] Backing store memory:   1013 KB
[7515:0x118008000] External memory global 0 KB
[7515:0x118008000] Total time spent in GC  : 2.1 ms
[7515:0x118008000]       53 ms: Scavenge stack scanning: survived_before= 155KB, survived_after= 850KB delta=81.7%
[7515:0x118008000] Fast promotion mode: false survival rate: 41%
[7515:0x118008000]       54 ms: Scavenge 3.4 (7.3) -> 3.3 (7.5) MB, 0.7 / 0.0 ms  (average mu = 1.000, current mu = 1.000) allocation failure 

我从输出中提取以下行:

[7515:0x118008000] Old space,              used:   1914 KB, available:    202 KB, committed:   2204 KB

并且将所使用的(例如1914 KB(和可用的(例如,202 KB(相加

这会是我的节点进程的最大旧空间大小吗?

这会是我的节点进程的最大旧空间大小吗?

否。V8将未使用的页面返回给操作系统。我不认为有一种方法可以追溯到堆(或旧空间(有史以来的最大大小,所以你必须在进程的整个生命周期内一直关注它(例如通过--trace-gc-verbose(,并跟踪你看到的最大值。

这可以通过简单的测试进行验证。例如:

let big = [];
for (let i = 0; i < 10000; i++) {
big.push(new Array(4*1024));  // About 16 KB.
}
gc();  // Old space now contains ~320 MB.
big = null;
console.log("Old space size should drop now");
gc();

如果您使用以下选项运行:node --expose-gc --trace-gc-verbose test.js | grep "Old space"那么最后三行输出将类似于:

[...] Old space,   used: 323146 KB, available:   91 KB, committed: 368760 KB
Old space size should drop now
[...] Old space,   used:   2685 KB, available:  221 KB, committed:   3960 KB

很明显,最后一行没有表示之前达到了320 MB的最大值
(如果Node启用指针压缩,或者如果您在Chrome或d8中运行指针压缩,则峰值内存使用量将减半,降至约160 MB;这不会改变此处的关键点。(


旁注:我对这个问题感到困惑,因为我不知道你想要的这个值可能有用/相关。如果你想在生产中监控应用程序的内存消耗,那么查看所有空间会更有意义,而不仅仅是旧空间。如果你想确定如何将最大旧空间大小配置为合理的值,那么我认为这种方法不会给出一个很好的答案,你可能会对这个问题感兴趣。

最新更新