Javascript &引用;致命错误:新闻空间::重新平衡分配失败“;但是已经为垃圾收集器分配了更多的空间

Javascript &引用;致命错误:新闻空间::重新平衡分配失败“;但是已经为垃圾收集器分配了更多的空间,javascript,node.js,out-of-memory,v8,ramda.js,Javascript,Node.js,Out Of Memory,V8,Ramda.js,中断程序的代码段: 然后,我对每个对象在该数组上执行了三个步骤: 为数组中的每个元素添加空字段 根据阵列中元素的一个属性删除重复 分类 我已经将新的空间大小和旧的空间大小都设置为相对较大的空间(10g和40g)。 每个步骤只是一个函数,它将读取数组并输出一个新数组。所以我相信这里没有内存泄漏(不确定tho) 我已经将新的空间大小和旧的空间大小都设置为相对较大的空间(10g和40g)。 如果我只执行上述三个任务,它将抛出关于垃圾收集器和内存问题的错误。然而, 如果我在排序之后添加另一个consol

中断程序的代码段: 然后,我对每个对象在该数组上执行了三个步骤:

  • 为数组中的每个元素添加空字段
  • 根据阵列中元素的一个属性删除重复
  • 分类
  • 我已经将新的空间大小和旧的空间大小都设置为相对较大的空间(10g和40g)。 每个步骤只是一个函数,它将读取数组并输出一个新数组。所以我相信这里没有内存泄漏(不确定tho) 我已经将新的空间大小和旧的空间大小都设置为相对较大的空间(10g和40g)。 如果我只执行上述三个任务,它将抛出关于垃圾收集器和内存问题的错误。然而, 如果我在排序之后添加另一个console.log()步骤,那么问题就不会再发生了

    我的问题:

  • 这是因为垃圾收集器没有足够的时间来收集垃圾吗?(自从我添加console.log()作为最后一步, 程序需要额外的时间在控制台中打印内容)
  • 根据“最近几次GCs”的信息,它正在进行清理,这是新空间的gc算法。但是在错误stacktrace信息中,它说markcompact期间发生了错误, 这是旧的空间gc算法。那么这个错误是在新空间gc还是旧空间gc期间发生的呢
  • 在这方面有任何潜在的优化或解决方案吗

  • 这里是V8开发者。新空间不应该(或设计)如此之大,所以我首先要尝试的是一个明显更小的新空间。理想情况下,完全删除
    --max semi-space size
    标志。如果您坚持设置,请选择一个值,如8、16或32(可能弊大于利)。分代堆布局背后的整体思想是新空间比旧空间小得多。如果希望允许较大的堆,请增加旧的空间大小,而不使用新的空间大小

    关于你的问题:

  • 不,垃圾收集器将花费所需的时间。我不知道为什么添加
    console.log
    语句会对这种情况产生影响
  • Mark compact包括扫气功能。故障发生在扫气期间,因为新空间太大
  • 删除
    --max semi space size
    (保留默认值)应该会有所帮助

  • 谢谢你的帮助。我仅使用“最大旧空间大小”设置删除了该标志。但错误仍然存在。你能再解释一下为什么大型新空间会使清除gc失败吗?如果内存使用曲线差异很大怎么办?@YinghanMa:新空间的设计(和测试)是几兆字节,而不是几千兆字节。堆栈跟踪是否仍然完全相同?@Mike:你是什么意思?@jmrk内存使用曲线是否与垃圾收集相关?或者该曲线是否会导致OOM?如果否,第一个问题是否表示项目中存在内存泄漏?
    <--- Last few GCs --->
    
    [19246:0x3c0ba70] 13018753 ms: Scavenge 15929.0 (32800.1) -> 17647.7 (32800.1) MB, 236071.8 / 0.0 ms  (average mu = 0.309, current mu = 0.369) allocation failure 
    [19246:0x3c0ba70] 13263082 ms: Scavenge 15929.0 (32800.1) -> 17701.0 (32800.1) MB, 238469.3 / 0.0 ms  (average mu = 0.309, current mu = 0.369) allocation failure 
    [19246:0x3c0ba70] 13510095 ms: Scavenge 15929.0 (32800.1) -> 17763.1 (32800.1) MB, 240951.1 / 0.0 ms  (average mu = 0.309, current mu = 0.369) allocation failure 
    
    
    <--- JS stacktrace --->
    Cannot get stack trace in GC.
    FATAL ERROR: NewSpace::Rebalance Allocation failed - JavaScript heap out of memory
     1: 0x8dc510 node::Abort() [node]
     2: 0x8dc55c  [node]
     3: 0xad9b5e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
     4: 0xad9d94 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
     5: 0xec7bf2  [node]
     6: 0xefaf66 v8::internal::MarkCompactCollector::Evacuate() [node]
     7: 0xefb5c2 v8::internal::MarkCompactCollector::CollectGarbage() [node]
     8: 0xed3411 v8::internal::Heap::MarkCompact() [node]
     9: 0xed3b01 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
    10: 0xed4704 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
    11: 0xed7371 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node]
    12: 0xea0466 v8::internal::Factory::AllocateRawArray(int, v8::internal::PretenureFlag) [node]
    13: 0xea0cea v8::internal::Factory::NewFixedArrayWithFiller(v8::internal::Heap::RootListIndex, int, v8::internal::Object*, v8::internal::PretenureFlag) [node]
    14: 0xea12a7 v8::internal::Factory::NewUninitializedFixedArray(int, v8::internal::PretenureFlag) [node]
    15: 0xe62190  [node]
    16: 0xe65322  [node]
    17: 0xe65682  [node]
    18: 0xe665a2 v8::internal::ArrayConstructInitializeElements(v8::internal::Handle<v8::internal::JSArray>, v8::internal::Arguments*) [node]
    19: 0x10fa09f v8::internal::Runtime_NewArray(int, v8::internal::Object**, v8::internal::Isolate*) [node]
    20: 0x1bac6fc5be1d 
    Aborted (core dumped)
    
    Environment: 
        NAME="Ubuntu"
        VERSION="18.04.1 LTS (Bionic Beaver)"
    npm version: 6.4.1
    node version: 10.15.3
    run command: node --max-semi-space-size=10000 --max-old-space-size=40000 xx.js
    Memory: 80G
    Data size: 1028673 records (1 record ~= 4kb) (so approx. 4gib in total)
    
    const enrollments = compose(  //ramda functions
        sortBy(prop('date')), 
        deduplicationRecord,
        map(normalizeEnrollment)
    );