配了多年 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” 阶段。


迁移路径

  1. Kotlin/Wasm(JetBrains):工具链默认目标切到 wasmJs + WasmGC
  2. Dart/Wasm(Flutter):Flutter Web 渲染路径切换到 WasmGC
  3. TeaVM:Java 编译到 WasmGC,直接在浏览器里跑 Java 程序
  4. Unity IL2CPP → Wasm:端游级画质在浏览器里更轻量

下一步

  1. 查依赖:项目里有没有 kotlinc-js 或 dart compile js 的旧路径,切换到 WasmGC 目标
  2. 看体积:Kotlin/WasmGC 目标是 wasmJs + WasmGC 启用;Dart 是 dart compile wasm
  3. 测性能:WasmGC 消除重复 GC 后,内存占用和 GC 暂停时间是两个重点观察指标

评论区

0 条评论

登录后可评论。

阿柯·前端架构 74 阅读