Chromium浏览器内核是内存大户。为此我们进行了一些内存优化的预研工作。
首先我们先对源码无入侵的进行内存优化。
经过都命令行参数的一轮浏览,List of Chromium Command Line Switches « Peter Beverloo
我们找到以下命令行具有内存优化效果:
enable-low-end-device-mode 以低性能设备模式运行
in-process-gpu:避免创建GPU进程
disable-gpu:关闭GPU加速(如果没有用到webgl,复杂的canvas绘制,可以考虑关闭)
enable-features="NetworkServiceInProcess,StorageServiceInProcess,AudioServiceInProcess,TracingServiceInProcess":只保留渲染进程
js-flags=“--jitless,--optimize_for_size":减少js执行内存消耗
以上命令对降低内存使用有明显的效果,至少能减少30%以上内存耗用。
不过enable-low-end-device-mode有坑,会导致浏览器颜色数量从32位降低到16位。因此我们不能用这个。
但是enable-low-end-device-mode对内存控制很有效果,接下来我们对源码进行修改,尝试继续减少内存耗用。
然后我们通过修改源码进行内存优化:
1.修改可用内存检测逻辑:找到enable-low-end-device-mode的原理,发现在enable-low-end-device-mode模式下,
AmountOfPhysicalMemory返回内存数为512MB;在代码其他地方也针对512MB有一些特殊处理。因此我们修改此处源码,返回513MB,避免陷入16色以及其他一些低内存设备的特殊逻辑,但是又严格限制了各项缓存的最大大小。
2.继续探索,发现render消耗内存严重。经过分析,找到
src\third_party\swiftshader\src\Device
发现Renderer.hpp直接申请了很大的buffer以支持并行渲染。
改小,改小。
这里要是能改成按需申请就最好了,不过改动太大。我们尽可能对源码保持最小更改。
还有一些边边角角渲染内存的,优化一下。
3.继续探索,发现在创建浏览器进程比较消耗cpu和内存的又一大户,和3D有关的glsLang解析引擎:
其在初始化的时候会调用warmup,看上去是为了修复什么bug而直接跑一段glslang,要是用不上赶紧屏蔽掉。
因此新增eef-disable-glslang命令支持disable glslang模块。
优化效果
这是最简单快速有效的内存优化。经过这一轮折腾,我们测试了一下:
使用原生chromuim引擎运行Typora:
使用优化后的eef引擎运行Typora:
总内存从119MB降到78MB,进程数也大大减少。
除了优化引擎本身,对html,js的优化也是非常重要的。chromuim提供的强大的trace-config-file命令,可以了解引擎各个部分的内存消耗情况。更多的针对资源cache等策略的优化,也能大大降低内存使用。