将 Electron 从 1 升级到 10 后,--max-old-space-size 命令不能设置大于 4GB 的值



My Problem这个月我把我的项目从Electron 1升级到Electron 10了。我发现下面的命令现在不起作用了。没有代码更改。

app.commandLine.appendSwitch('js-flags', '--max-old-space-size=6144')

硬件配置:64位,32GB内存,Windows 10

我试着

  1. clone repo at Electron Demo.
  2. 添加以下代码:
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的值成功。何时崩溃取决于我设置的值。

我研究

  1. V8 v8.0带来指针压缩. 听起来好像V8限制堆大小为4gb,所以我们不能增加它。
  2. 但我试图在纯Node.js v14.17.6 (V8 v8.4.371.23)中增加它,没有电子。它的工作原理。从这个问题来看,Node.js仍然禁用指针压缩。
node --max-old-space-size=6144 index.js
  1. 所以V8在电子限制的大小,同时V8在Node.js没有?我不确定我是否正确。我在等一个明确的答复。
  2. 如果我需要增加尺寸,现在降级电子是唯一的方法吗?

(这里是V8开发人员)您的分析似乎是正确的:Electron 9.0启用了V8指针压缩,而指针压缩意味着最大堆大小上限为4GB(因为压缩的指针每个指针使用32位)。

指针压缩是V8的构建时标志。嵌入者可以自由选择是否启用它,但这个决定必须在构建时做出,而不能在运行时做出。如果构建自己的Electron,则可以相应地更改配置并重新编译以关闭指针压缩。Node.js决定禁用指针压缩,这就是为什么更大的堆在那里工作。

我想你也可以要求电子项目提供没有指针压缩的预构建二进制文件,但我不知道他们有多大可能适应这样的请求。

请注意,由于指针压缩的内存节省效果(这就是该功能存在的原因!),4GB压缩堆大致相当于6GB未压缩堆(确切的数字取决于你的应用程序正在做什么)。

相关内容

  • 没有找到相关文章

最新更新