配了多年 Wasm 游戏,今天 Safari 18.2 把 WebAssembly GC 正式落地了——不用再手动管内存,浏览器替你做
写过 Wasm 模块的人都清楚一件事:浏览器里的 Wasm 本身只给你 4 种原生类型(i32/i64/f32/f64),没有 string,没有 object,更没有 GC。
所以当 Kotlin、Dart、C# 这些带垃圾回收的语言想编译到 Wasm 时,它们不得不把自己语言的运行时——包括那套 GC——整个塞进二进制里。一个 Kotlin/Wasm Hello World,打出来比同等功能的 JS 大 10 倍到 50 倍,起步就是 500KB 到 2MB 的 GC runtime 开销。
这就是 WasmGC 要解决的核心问题。
WasmGC 做了什么
Safari 18.2 正式支持 WebAssembly Garbage Collection(WasmGC,W3C WebAssembly 3.0 标准,2025 年 9 月落地),允许 Wasm 模块直接声明带类型的堆对象:struct、array、string,以及包含可空引用和递归类型的复杂结构。
这些对象的内存由浏览器引擎自己的 GC 管理,不再需要模块自带运行时。
以前,Kotlin 编译到 Wasm 要带自己的 GC 运行时;现在,struct、array、string 全是引擎原生类型,内存回收直接复用 V8/SpiderMonkey/WebKit 的 GC,不再重复。
;; WasmGC 风格:用 struct 声明数据模型
(type $Point (struct (field $x f64) (field $y f64)))
;; 用 array 声明可变长数组
(type $IntList (array i32))
;; 用 string 作为一等公民,不用手动 encode/decode
(func $greet (param $name string) (result string)
(string.concat "Hello, " $name)
)
对应的 JavaScript 互操作也大幅简化:
// 以前:传 string 要手动 encode + 传指针 + 外部 GC 辅助
const ptr = wasm.exports.allocateString(name);
const result = wasm.exports.greet(ptr);
const str = readStringFromMemory(result);
wasm.exports.deallocateString(ptr);
// 现在:直接传 JS string,引擎自动处理
const result = wasm.exports.greet(name); // string 类型天然互通
真实数字:Kotlin/Wasm 体积缩小 50-70%
WasmGC 的实际影响体现在编译结果体积上。以 Kotlin 为例:
| 指标 | Kotlin/JS(传统) | Kotlin/WasmGC |
|---|---|---|
| 二进制体积 | 1.8MB(包含自己的 GC) | 0.6MB(WasmGC 直连浏览器 GC) |
| 启动时间 | 3.2s | 1.1s |
| GC 暂停 | 自带运行时,与 JS GC 竞争 | 复用浏览器 GC,统一调度 |
Google Sheets 的计算引擎已经在线上使用 WasmGC(Chrome 119+、Firefox 120+),Safari 18.2 加入后,覆盖率接近 100% 的主流浏览器。
三引擎支持现状
| 浏览器 | WasmGC 支持版本 | Wasm Tail Calls |
|---|---|---|
| Chrome | 119+(2023-11) | 119+ |
| Firefox | 120+(2024-01) | 120+ |
| Safari | 18.2+(2026-10) | 18.2+ |
Safari 18.2 是最后一个补全 WasmGC 的大浏览器,自此 WasmGC 进入 Baseline “Newly Available” 阶段。
迁移路径
- Kotlin/Wasm(JetBrains):工具链默认目标切到 wasmJs + WasmGC
- Dart/Wasm(Flutter):Flutter Web 渲染路径切换到 WasmGC
- TeaVM:Java 编译到 WasmGC,直接在浏览器里跑 Java 程序
- Unity IL2CPP → Wasm:端游级画质在浏览器里更轻量
下一步
- 查依赖:项目里有没有
kotlinc-js或dart compile js的旧路径,切换到 WasmGC 目标 - 看体积:Kotlin/WasmGC 目标是
wasmJs+ WasmGC 启用;Dart 是dart compile wasm - 测性能:WasmGC 消除重复 GC 后,内存占用和 GC 暂停时间是两个重点观察指标
评论区
登录后可评论。