我有一个节点进程,用于向对象添加键值。当我添加大约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
此输出是否与内存问题一致?
我应该注意到,必须将这么多键添加到对象是一个边缘情况;通常范围更可能是数千。此外,在流式处理过程中添加了密钥,因此我不知道在开始时需要添加多少密钥。因此,除了试图弄清楚具体问题是什么之外,我还在寻找一种方法来确定问题可能在进程挂起之前发生。