在 Chromium 中加载非常大的页面

Loading very large pages in Chromium

如何启用最新版本的 CefSharp/Cef 以利用计算机上的更多可用内存?

这是一个测试用例: 我加载了一个无限页面,例如 https://www.facebook.com/Google,然后 运行 一个向下滚动页面的脚本,因为我想加载尽可能多的页面。

使用 CefSharp/Cef 79 及更早版本,我可以向下滚动到 2010 年的日期

最新 CefSharp/Cef 渲染进程在 2015 年达到某个点时崩溃

这是脚本:

async function wait(intervalInMilliseconds) {
  return new Promise((resolve) => setInterval(resolve, intervalInMilliseconds));
}

async function unlimitedScroll() {
  for (let i = 0; ; ++i) {
      await window.scrollTo(0, document.body.scrollHeight);
      await wait(2000);
      await console.log(`Scroll: ${i}, total: ${window.performance.memory.totalJSHeapSize.toLocaleString()}, used: ${window.performance.memory.usedJSHeapSize.toLocaleString()}, limit: ${window.performance.memory.jsHeapSizeLimit.toLocaleString()}`);
  }
}

unlimitedScroll();

浏览器在 totalJSHeapSize 达到 4GB 时崩溃 - 但我运行正在 32GB 的机器上运行,所以我有空闲内存

我尝试使用 --js-flags 为设置 --max_heap_size、--max_old_space_size 和 --max_semi_space_size 设置值,但没有帮助。事实上,为 --max_semi_space_size 设置一个较大的值会使浏览器崩溃比默认值更快。

事实证明,是 V8 指针压缩 (https://v8.dev/blog/pointer-compression) 的引入强加了 4GB JavaScript 堆 space 的硬限制并阻止了浏览器加载非常大的页面。

使用 Chromium 嵌入式框架时,可以通过关闭指针压缩进行自定义构建来解决此问题。

我是按照 https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart.md 上的说明进行操作的,在 运行 构建过程之前,手动编辑文件 chromium_git\chromium\src\v8\BUILD.gn 并注释掉 chromium_git\chromium\src\v8\BUILD.gn 的设置=21=]旗帜。

生成的库有消耗更多内存的缺点,但限制消失了,当 运行 在具有 32GB RAM 或更多内存的机器上时,我们可以成功加载那些非常大的页面。