WebAssembly GC 与 JavaScript 终结器协作
在 Node.js 中让 WASM 分配的对象自动注册 FinalizationRegistry,实现跨运行时内存回收。 · 难度:入门 · +10XP
WebAssembly GC 与 JavaScript 终结器协作
WebAssembly 的 GC 提案在 Node.js 22+ 可用。本教程演示如何创建 WASM GC 对象并使其成为 JavaScript 终结器(FinalizationRegistry)的注册目标。当 WASM 堆中的对象不再被引用时,通过 externref 回调通知 JS 释放关联的 wrapper。你将了解 wasm-gc 类型的引用语义、FinalizationRegistry 的 unregister 机制以及如何避免悬挂指针。
const registry = new FinalizationRegistry((held) => {
console.log('WASM 对象被回收:', held);
});
const wasmCode = new Uint8Array([/* WASM GC 模块字节码 */]);
const module = new WebAssembly.Module(wasmCode);
const instance = new WebAssembly.Instance(module);
const obj = instance.exports.createGcObject();
registry.register(obj, 'myObject', obj);
// 当 obj 失去引用时,终结器会自动调用