My Problem这个月我把我的项目从Electron 1升级到Electron 10了。我发现下面的命令现在不起作用了。没有代码更改。
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=6144')
硬件配置:64位,32GB内存,Windows 10
我试着
- clone repo at Electron Demo.
- 添加以下代码:
const showMemory = () => {
const mem = process.memoryUsage()
const format = bytes => {
return (bytes / 1024 / 1024).toFixed(4) + ' MB'
}
console.log('process: heapTotal ' + format(mem.heapTotal) + ', heapUsed ' + format(mem.heapUsed))
}
const arr = []
while(true) {
arr.push(new Array(1000000))
showMemory()
}
Electron>=v9.0.0:我可以设置的最大值是4GB。如果我设置8GB,它仍然是4GB。它可以减少,但不能增加。
Electron <=v8.5.5: Set一个大于4GB的值成功。何时崩溃取决于我设置的值。
我研究
- V8 v8.0带来指针压缩. 听起来好像V8限制堆大小为4gb,所以我们不能增加它。
- 但我试图在纯Node.js v14.17.6 (V8 v8.4.371.23)中增加它,没有电子。它的工作原理。从这个问题来看,Node.js仍然禁用指针压缩。
node --max-old-space-size=6144 index.js
- 所以V8在电子限制的大小,同时V8在Node.js没有?我不确定我是否正确。我在等一个明确的答复。
- 如果我需要增加尺寸,现在降级电子是唯一的方法吗?
(这里是V8开发人员)您的分析似乎是正确的:Electron 9.0启用了V8指针压缩,而指针压缩意味着最大堆大小上限为4GB(因为压缩的指针每个指针使用32位)。
指针压缩是V8的构建时标志。嵌入者可以自由选择是否启用它,但这个决定必须在构建时做出,而不能在运行时做出。如果构建自己的Electron,则可以相应地更改配置并重新编译以关闭指针压缩。Node.js决定禁用指针压缩,这就是为什么更大的堆在那里工作。
我想你也可以要求电子项目提供没有指针压缩的预构建二进制文件,但我不知道他们有多大可能适应这样的请求。
请注意,由于指针压缩的内存节省效果(这就是该功能存在的原因!),4GB压缩堆大致相当于6GB未压缩堆(确切的数字取决于你的应用程序正在做什么)。