如何解决在 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();
浏览器在总JSHeapSize达到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 堆空间的硬限制,并阻止了浏览器加载非常大的页面。
使用 Chromium 嵌入式框架时,可以通过关闭指针压缩进行自定义构建来解决这个问题。
我按照 https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart.md 中的说明进行了此操作,在运行构建过程之前,手动编辑了文件 Chromium_git\chromium\src\v8\BUILD.gn 并注释掉了 V8_COMPRESS_POINTERS 标志的设置。
由此产生的库有消耗更多内存的缺点,但限制已经消失,当在具有 32GB RAM 或更大内存的机器上运行时,我们可以成功加载那些非常大的页面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。