理解 Tauri 的内存占用,首先要清楚它由两个独立进程组成:Rust 主进程 和 WebView 渲染进程。这种分离本身就是 Tauri 轻量的关键,因为每一部分只负责自己该做的事情,没有任何多余的负载。
1. Rust 主进程
Rust 主进程是应用的大脑,负责窗口管理、系统调用、IPC 调度和你编写的所有 Rust 后端逻辑。它的内存消耗来源于:
- 编译后的原生二进制:Rust 代码直接编译为机器码,没有虚拟机或解释器的开销,启动后占用的内存非常小,通常只有 5~15 MB。
- 业务逻辑所需的堆内存:取决于你的文件读写、数据缓存、网络请求等操作。由于 Rust 的所有权模型,内存会被高效且及时地释放,不会出现像 JavaScript 引擎那样的内存碎片或不可预测的 GC 尖峰。
- 全局对象和上下文:如 Tauri 的状态管理器、插件实例等,这些都是编译时就确定大小的结构,内存占用极为可控。
即使你的 Rust 逻辑在后台处理密集计算或大文件流,它的内存增长也是线性且可预期的,并且完成操作后几乎立即回收。
2. WebView 进程
WebView 进程负责渲染你的前端界面(HTML、CSS、JavaScript)。它本质上就是操作系统内置的浏览器引擎(Windows 上的 WebView2、macOS 上的 WKWebView、Linux 上的 WebKitGTK),因此它的内存占用和你在系统浏览器中打开同样页面差不多。
- 基础开销:一个空白页面的 WebView 进程大约占用 10~30 MB,因为系统 WebView 已经有很多共享缓存和字体资源,不需要像 Electron 那样重新加载整个浏览器框架。
- 前端应用的实际消耗:这部分完全取决于你的前端代码——使用了多大体积的框架、加载了多少图片、保留了多少 DOM 节点。你可以像优化普通网页一样优化它(代码分割、懒加载、及时销毁不用的组件)。
- 多窗口情况:Tauri 默认会为每个窗口创建一个独立的 WebView 进程(也可以配置为共享),但每个新增的 WebView 依然很轻(通常 10~20 MB),因为系统级的资源(如 GPU 进程、网络进程)是复用的。
为什么这个组合总体很省内存?
- 没有重复加载:Electron 每个窗口都带一个完整的 Chromium 渲染引擎,而 Tauri 用的 WebView 本来就属于操作系统的一部分,已经被很多其他应用共享和预热。
- Rust 主进程永远小巧:无论前端变得多么复杂,Rust 端的内存占用基本恒定,不会因为 UI 渲染而波动。
- 真正的进程隔离:前端崩溃(如内存泄漏或无限循环)只会影响 WebView 进程,Rust 主进程可以监控并重启它,而且 WebView 进程一旦关闭,其所占内存会立即被系统回收,不会拖累整个应用。
实际内存曲线
一个典型的 Tauri 应用(比如一个文档编辑器),启动后 Rust 主进程稳定在 8 MB 左右,一个 WebView 进程初始 25 MB,加载完界面并打开几个文件后可能上升到 40~60 MB。关闭所有文件后,WebView 进程会回到 30 MB 左右,Rust 主进程几乎不动。而 Electron 版本同样的应用,可能一启动就 150 MB+,使用中轻松超过 300 MB。
这种“各司其职、互不拖累”的内存模型,意味着 Tauri 应用即使长期运行,用户也不会感觉到内存占用在悄悄膨胀。对于需要驻留后台、系统托盘常驻的应用而言,这一点尤其重要。