从内存占用角度阐述 uBlock 安装以后内部发生了什么 - fang5566/uBlock GitHub Wiki

  1. uBlock Origin(uBO)会载入默认选择的过滤规则列表:
    • 这时会出现短时的内存波动(因为在载入、解析、排序和保存),但最终会被垃圾收集器回收
    • 所有这些短时内存波动会导致 uBO 的基准内存占用值增加
  2. 几分钟之后,uBO 会检查是否有过滤规则列表需要更新
  3. 如果有一个或多个规则列表需要更新,uBO 会启动后台任务以获取规则列表的最新版本,无论列表实际是否过期。
  4. 一旦所有规则列表更新完毕,uBO 就会从内存中刷新并载入最新版本的列表
    • 这时又会出现一轮短时的内存波动,但最终会被垃圾收集器回收
    • 同样地所有这些短时内存波动会导致 uBO 的基准内存占用值增加
    • 你可以根据自己需要禁止自动更新,但建议让 uBO 来管理,手动强制更新还是作为第二选择吧
  5. 几分钟之后,如果没再选择其他规则列表或列表内容没有发生变化,uBO 会生成一个快照
    • 有了快照 uBO 下次载入时就可以跳过解析和排列数据的步骤
    • 生成快照同样也会导致短时的内存波动,但最终也会被垃圾收集器回收
    • 同样地所有这些短时内存波动会导致 uBO 的基准内存占用值增加
    • 任何更改规则列表的选择和列表内容发生变化都会使 uBO 的快照作废
  6. 即使基准内存占用值增加,在进行垃圾回收以后 uBO 的_自身内存占用_ 依然要比 Adblock Plus 要少一些。
  7. uBO 在打开网页之后_增加的一小部分内存占用_ 也远比 ABP 来得少
    • 打开网页以后增加的内存占用只是网页本身内存占用的一部分
    • 相对于用 Chromium 的_"任务管理器 "_查看到的扩展自身内存占用值,打开网页后增加的内存占用值用户是无法轻易查看到的
    • 虽然这个值不太直观,但足以得出 uBO 比 ABP 节省内存的结论了,毕竟 uBO 没有将数千条 CSS 规则插入到网页和嵌入框架当中(ABP 则不同)

如果此时你的 uBO 已经有了一份有效的快照,那么它的运行效率就最高。

因为下次你启动 uBO 时如果有一份有效的快照,那它的载入时间就会比没有快照时缩短很多[1],基准内存占用也比没有时要少。

所以我的观点是如果你让 uBO 在安装以后自我优化,那它的运行效率就会最高,意思是 uBO 后续启动时的运行效率比你初次安装时观察到的要更高。

[1] 参见 https://www.youtube.com/watch?v=BpypOeK10N8


如果你想自行观察内存占用,除了上面提到的垃圾收集,还要注意以下一些事项:

  • 这个 Chromium 的 bug 会导致打开扩展弹出界面时系统性地产生内存泄漏
  • 当前打开的扩展选项页面会增加扩展本身的内存占用值
  • 有时一个浏览器的垃圾收集 ("GC") 会比其他浏览器来得懒,也就是更迟才执行
    • 在测试时发生过我得使用开发工具强制执行 GC 的情形

⚠️ **GitHub.com Fallback** ⚠️