我正试图找到节点进程的最大旧空间大小。
首先,我尝试使用process.memoryUsage()
中的heapTotal
,但是:
- 这包含整个堆,而不是旧空间的最大大小(请参阅此处了解更多区别(
- 我不能每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;这不会改变此处的关键点。(
旁注:我对这个问题感到困惑,因为我不知道你想要的这个值可能有用/相关。如果你想在生产中监控应用程序的内存消耗,那么查看所有空间会更有意义,而不仅仅是旧空间。如果你想确定如何将最大旧空间大小配置为合理的值,那么我认为这种方法不会给出一个很好的答案,你可能会对这个问题感兴趣。