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

After upgrading Electron from 1 to 10, the --max-old-space-size command can't set a value larger than 4GB

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

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

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

我的尝试

  1. Electron Demo.
  2. 克隆回购
  3. 添加以下代码。
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: 成功设置大于 4GB 的值。什么时候崩溃取决于我设置的值。

我的研究

  1. V8 v8.0带来Pointer Compression。听起来 V8 将堆大小限制为 4 GB,所以我们不能增加它。
  2. 但我尝试在纯 Node.js v14.17.6 (V8 v8.4.371.23) 中增加它,没有 Electron。有用。由此 issues,Node.js 现在仍然禁用指针压缩。
node --max-old-space-size=6144 index.js
  1. 所以 Electron 中的 V8 限制了大小,而同时 Node.js 中的 V8 却没有?我不确定我是否正确。我等待一个明确的答案。
  2. 如果我需要增加大小,现在降级 Electron 是唯一的方法吗?

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

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

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

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