Node.js进程在创建巨大对象时挂起

时间:2018-05-03 19:37:22

标签: node.js memory memory-management memory-leaks garbage-collection

我有一个节点进程,用于向对象添加键值。当我添加大约988万个密钥时,该过程似乎挂起。我假设一个内存不足的问题,所以我打开了trace_gc并且还检查了添加密钥的代码:

const { heapTotal, heapUsed } = process.memoryUsage()
if ((heapUsed / heapTotal) > 0.99) {
  throw new Error('Too much memory')
}

这种情况从未得到满足,错误从未被抛出。至于--trace_gc输出,我的最后一个清除日志是:

[21544:0x104000000]  2153122 ms: Scavenge 830.0 (889.8) -> 814.3 (889.8) MB, 1.0 / 0.0 ms  allocation failure
然而,

Mark-sweep继续记录下来:

[21544:0x104000000]  3472253 ms: Mark-sweep 1261.7 (1326.9) -> 813.4 (878.8) MB, 92.3 / 0.1 ms  (+ 1880.1 ms in 986 steps since start of marking, biggest step 5.6 ms, walltime since start of marking 12649 ms) finalize incremental marking via task GC in old space requested

此输出是否与内存问题一致?

我应该注意到,必须将这么多键添加到对象是一个边缘情况;通常范围更可能是数千。此外,在流式处理过程中添加了密钥,因此我不知道在开始时需要添加多少密钥。因此,除了试图弄清楚具体问题是什么之外,我还在寻找一种方法来确定问题可能在进程挂起之前发生。

0 个答案:

没有答案