将堆移出内存,即使可用堆内存比已使用的大得多,也会发生错误

时间:2019-04-02 01:47:46

标签: javascript node.js dictionary v8 es6-map

即使我使用以下命令运行具有高堆内存的节点,也会遇到以下错误:node --max-old-space-size=8000 manipulateFiles.js

FATAL ERROR: invalid table size 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: 0x102d7b2 v8::internal::OrderedHashTable<v8::internal::OrderedHashMap, 2>::Allocate(v8::internal::Isolate*, int, v8::internal::PretenureFlag) [node]
7: 0x1030946 v8::internal::OrderedHashTable<v8::internal::OrderedHashMap, 2>::Rehash(v8::internal::Handle<v8::internal::OrderedHashMap>, int) [node]
8: 0x1030f69 v8::internal::OrderedHashTable<v8::internal::OrderedHashMap, 2>::EnsureGrowable(v8::internal::Handle<v8::internal::OrderedHashMap>) [node]
9: 0x1114c7e v8::internal::Runtime_MapGrow(int, v8::internal::Object**, v8::internal::Isolate*) [node]
10: 0x908bb15be1d 
Aborted (core dumped)

崩溃时使用的堆内存量为1.79G。可用量为6.15G。我使用v8模块和process来获取这些数字。

因此,显然,除了堆大小以外,还有其他原因导致了问题。该模块基本上会扫描一个大型CSV文件并构建一个Map,以供以后在此过程中参考。该地图最多可以包含3000万个键。该模块可以在其他较小的文件(1000万个密钥)上正常工作。但是即使在可用堆大小远大于使用的堆大小的情况下,它仍然在此给出此错误。

还有什么可能导致这样的问题?

1 个答案:

答案 0 :(得分:2)

V8开发人员在这里。尽管您在堆栈跟踪中看到了函数名,但这并不是要整体上耗尽内存,而是要达到单个对象的最大大小(在这种情况下为if (sr_enbhdlr(EV_ANYDEV, EV_ANYEVT, SRL::dx_handler) == -1) )。请参阅此答案以解释详细信息:https://stackoverflow.com/a/54466812/6036428