浏览器开久了风扇狂转,任务管理器一看好几个 G 内存没了。这事儿挺常见。

Brave 的工程师盯上了一个"内存大户":广告拦截器。他们做了一次彻底的内存优化。

广告拦截器为什么这么吃内存?

想象一下,你是一个小区保安,手里有一本"黑名单",上面写着 10 万个不能进小区的人名。

每次有人进门,你都要翻一遍这本名单,看看这人在不在上面。

这就是广告拦截器干的事。

┌─────────────────────────────────────────────────┐
│              广告拦截器的工作流程                  │
├─────────────────────────────────────────────────┤
│                                                 │
│   网页请求 ──→ 检查 10 万条规则 ──→ 放行/拦截     │
│                     │                           │
│                     ▼                           │
│            ┌───────────────┐                    │
│            │  EasyList     │                    │
│            │  EasyPrivacy  │                    │
│            │  uBlock 规则   │                    │
│            │  ... 共 10 万+ │                    │
│            └───────────────┘                    │
│                                                 │
└─────────────────────────────────────────────────┘

Brave 浏览器默认带着超过 10 万条过滤规则。每条规则都包含匹配模式、选项标志、元数据这些东西。10 万条规则乘起来,还没打开网页呢,光这个"黑名单"就占了 60MB 内存。

Brave 的内存优化方案:Rust + FlatBuffers

Brave 1.85 版本悄悄发布了一个大更新:广告拦截引擎内存占用直降 75%。

不是什么 JavaScript 小技巧,也不是延迟加载的花招。是实打实的底层重构:用 Rust 重写,配合 FlatBuffers 数据格式。这是一次教科书级别的内存优化。

FlatBuffers 是什么?

继续用保安的例子。

以前把黑名单印成厚厚一本书,查人要翻书。FlatBuffers 把名单做成电子索引,输入名字秒出结果。

┌─────────────────────────────────────────────────────────┐
│                    传统方式 vs FlatBuffers               │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  传统方式(JSON/对象):                                  │
│  ┌─────────┐    解析     ┌─────────┐                    │
│  │ 原始数据 │ ─────────→ │ 内存对象 │  ← 占用大量内存     │
│  └─────────┘            └─────────┘                     │
│                                                         │
│  FlatBuffers:                                          │
│  ┌─────────┐   直接读取   ┌─────────┐                   │
│  │ 二进制块 │ ─────────→ │ 零拷贝访问│  ← 几乎不占额外内存 │
│  └─────────┘            └─────────┘                     │
│                                                         │
└─────────────────────────────────────────────────────────┘

FlatBuffers 是 Google 给游戏引擎开发的,那帮人对性能的要求是毫秒级的。核心思路就一个字:不复制

传统的数据格式,比如 JSON,读进来要先解析,解析完要创建对象,对象要存到堆内存里。一来二去,同样的数据在内存里可能存了好几份。

FlatBuffers 不玩这套。数据存成紧凑的二进制格式,要用的时候直接从原始数据里读,不创建中间对象,不复制数据。

这就是所谓的"零拷贝反序列化"。

为什么要用 Rust?

FlatBuffers 什么语言都能用,为什么选 Rust?内存安全。

浏览器是个高危环境。每天要处理无数来自互联网的数据,稍有不慎就可能被攻击。根据统计,Chrome 70% 的高危漏洞都来自内存安全问题。

C++ 写的代码处理不可信输入,就像让一个粗心的人拿着一把锋利的刀切菜,迟早要出事。

Rust 不一样。它在编译阶段就把内存问题堵死了,运行时又没有垃圾回收的开销。

┌─────────────────────────────────────────────────┐
│              语言特性对比                         │
├─────────────────────────────────────────────────┤
│                                                 │
│  C++:                                           │
│  ├── 性能高                                      │
│  ├── 内存手动管理                                │
│  └── 容易出安全漏洞                              │
│                                                 │
│  JavaScript:                                    │
│  ├── 开发快                                      │
│  ├── 有垃圾回收                                  │
│  └── 性能一般                                    │
│                                                 │
│  Rust:                                          │
│  ├── 性能高(和 C++ 一个级别)                    │
│  ├── 编译期内存安全检查                          │
│  └── 无垃圾回收开销                              │
│                                                 │
└─────────────────────────────────────────────────┘

对于广告拦截器这种要处理每一个 URL 和网络请求的组件,既要快又要安全,Rust 是目前最好的选择。

内存优化效果

到底省了多少?

┌─────────────────────────────────────────────────┐
│              优化前后对比                         │
├─────────────────────────────────────────────────┤
│                                                 │
│  内存占用:  60 MB  ──→  15 MB   (↓ 75%)        │
│                                                 │
│  内存分配:  减少 19%(使用栈分配替代堆分配)      │
│                                                 │
│  用户体验:  页面加载更流畅,风扇转得更少          │
│                                                 │
└─────────────────────────────────────────────────┘

这次内存优化节省了 75% 的内存:

10 万条规则现在存成一个紧凑的二进制块,Rust 代码直接读取,不创建中间对象。能用栈的地方不用堆,内存分配调用减少了 19%。数据不复制,直接从原始缓冲区读取。

浏览器还没打开网页,就已经省下了 45MB 内存。开一天浏览器,风扇都温和了不少。

为什么这件事值得关注?

浏览器市场现在基本被 Chrome 垄断了。大多数浏览器都是套个 Chromium 的壳,换个皮肤就上架。

Brave 走了另一条路。他们愿意花时间重写底层组件做内存优化,提升安全性。这些东西用户感知不明显,但让浏览体验实实在在变好了。

Brave 还计划把更多组件从 C++ 迁移到 Rust。每次迁移都能带来同样的好处:更低的内存占用,更好的安全性,更少的崩溃。这种内存优化思路值得整个浏览器行业借鉴。

总结一下

FlatBuffers 实现零拷贝,数据直接从二进制块读取。Rust 在编译期检查内存安全,运行时又没有垃圾回收开销。10 万条规则从 60MB 压到 15MB。Brave 这次内存优化给整个行业立了个标杆。

想试试?

Brave 基于 Chromium,Chrome 扩展都能用,但隐私保护和性能优化更用心。它的加密钱包功能有点烦人,界面也有些地方不够精致,但如果你在意内存占用和隐私,值得一试。


你平时用什么浏览器?内存占用怎么样?评论区聊聊。

下一篇说说 Rust 在 Linux 内核和 Android 系统里的应用,看看这门语言是怎么一步步"入侵"整个软件世界的。


文章有用就点个赞,转发给同样被浏览器内存困扰的朋友。关注梦兽编程,不错过更多技术资讯。