往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)
Linux环境下编译报错“JS heap out of memory”
问题现象
在Linux环境下,系统内存有64G,Hvigorw脚本中配置--max-old-space-size=40960,在编译构建时,实际在使用内存未达到配置的内存(例如使用到20G左右)就出现报错“JS heap out of memory“。
FATAL ERROR: NewSpace::Rebalance Allocation failed - JavaScript heap out of memory
Writing Node.js report to file: report.20200512.172528.47517.24.011.json
Node.js report completed
1: 0xa295e0 node::Abort() [node]
2: 0x9782df node::FatalError(char const*, char const*) [node]
3: 0xb99c2e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
4: 0xb99fa7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
5: 0xd3a3b5 [node]
6: 0xd74f27 [node]
7: 0xd84707 v8::internal::MarkCompactCollector::CollectGarbage() [node]
8: 0xd481b9 v8::internal::Heap::MarkCompact() [node]
9: 0xd48f0b v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
10: 0xd499a5 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
11: 0xd4aebf v8::internal::Heap::HandleGCRequest() [node]
12: 0xcf5f97 v8::internal::StackGuard::HandleInterrupts() [node]
13: 0x104b803 v8::internal::Runtime_StackGuard(int, unsigned long*, v8::internal::Isolate*) [node]
14: 0x13a5a99 [node]
Aborted (core dumped)
问题原因
vm.max_map_count是一个与内核虚拟内存子系统相关的参数,用于控制进程可以拥有的内存映射区域的最大数量。它通常用于限制一个进程可以打开的文件数量,特别是在使用大量内存映射文件的情况下。
在Linux系统上,vm.max_map_count参数的默认值通常是较小的数值,例如65530。然而,对于一些需要大量内存映射的应用程序或者特定的使用场景,可能需要增加该参数的值,以便支持更多的内存映射区域。
解决措施
修改vm.max_map_count的值:
- 临时修改:
sysctl -w vm.max_map_count=新值
- 永久修改:如果希望永久修改参数的值,可以编辑/etc/sysctl.conf文件,并添加或修改以下行:
vm.max_map_count=新值
保存文件后,使用以下命令使更改生效:
sysctl -p