即使可用堆内存比使用的大得多,也会出现堆内存不足错误

Posted

技术标签:

【中文标题】即使可用堆内存比使用的大得多,也会出现堆内存不足错误【英文标题】:Getting Heap out of memory Error even when available heap memory is much larger than used 【发布时间】:2019-04-02 01:47:46 【问题描述】:

即使我使用以下命令运行具有高堆内存的节点,我也会收到以下错误: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 万个密钥)上运行良好。但即使可用堆大小远大于使用的大小,它也会在此处不断出现此错误。

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

【问题讨论】:

节点版本 10.15 和操作系统是 linux mint 19.1 cinnamon 你能提供一个 sn-p 来重现这个吗?因为我的内存 sn-ps 使用两者都可以正常工作:--max-old-space-size=8000--max_old_space_size=8000 我也试过这个选项。不工作。当我拿到电脑时,我会尝试提供一个复制品。可能明天或今晚很晚!谢谢 好的,这是一个示例代码link。要处理相同的数据集,您可以从此link 下载文件。它是 2017 csv 下的 us_class 文件。它是一个 csv 文件而不是 JSON,我的错。谢谢! 也许你需要咬紧牙关,如果你想从你的程序中获得更有效的内存使用来处理大文件......除非你有办法正确地一次处理小块的管道,JavaScript 从未被认为是一种内存效率高的语言。 【参考方案1】:

V8 开发人员在这里。尽管您在堆栈跟踪中看到了函数名称,但这并不是关于总体内存不足,而是关于运行到单个对象的最大大小(在这种情况下为Map)。请参阅此答案解释详细信息:https://***.com/a/54466812/6036428

【讨论】:

感谢 jmrk!挽救了这一天。如果在这种情况下错误消息更准确,那将非常有帮助。

以上是关于即使可用堆内存比使用的大得多,也会出现堆内存不足错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Java 堆转储大小比已用内存小得多?

致命错误:使用任何“npm”命令时 JavaScript 堆内存不足

sparklyr中的堆空间不足,但有足够的内存

以块的形式处理比物理内存大得多的数据

NodeMCU:可用堆大小下降,直到内存不足错误

内存不足:添加 10KB ImageButtons 后出现堆大小错误