diff --git a/src/content/changelog/workers/2025-05-05-finalization-registry.mdx b/src/content/changelog/workers/2025-05-05-finalization-registry.mdx new file mode 100644 index 00000000000000..4e8f966c3c6bd4 --- /dev/null +++ b/src/content/changelog/workers/2025-05-05-finalization-registry.mdx @@ -0,0 +1,13 @@ +--- +title: Improved Memory Efficiency for WebAssembly Workers +description: With the introduction of FinalizationRegistry in Workers Runtime, toolchains like Emscripten and wasm-bindgen can automatically reclaim unused WebAssembly heap and reduce memory leaks. +products: + - workers +date: 2025-05-05T00:00:00Z +--- + +[FinalizationRegistry](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry) is now available in Workers. You can opt-in using the [`enable_weak_ref`](/workers/configuration/compatibility-flags/#enable-finalizationregistry-and-weakref) compatibility flag. + +This can reduce memory leaks when using WebAssembly-based Workers, which includes [Python Workers](/workers/languages/python/) and [Rust Workers](/workers/languages/rust/). The FinalizationRegistry works by enabling toolchains such as [Emscripten](https://emscripten.org/) and [wasm-bindgen](https://rustwasm.github.io/wasm-bindgen/) to automatically free WebAssembly heap allocations. If you are using WASM and seeing Exceeded Memory errors and cannot determine a cause using [memory profiling](/workers/observability/dev-tools/memory-usage/), you may want to enable the FinalizationRegistry. + +For more information see the [`enable_weak_ref`](/workers/configuration/compatibility-flags/#enable-finalizationregistry-and-weakref) compatibility flag documentation. diff --git a/src/content/compatibility-flags/js-weak-refs.md b/src/content/compatibility-flags/js-weak-refs.md new file mode 100644 index 00000000000000..eef7c4cb1ab8c2 --- /dev/null +++ b/src/content/compatibility-flags/js-weak-refs.md @@ -0,0 +1,24 @@ +--- +_build: + publishResources: false + render: never + list: never + +name: "Enable `FinalizationRegistry` and `WeakRef`" +sort_date: "2025-05-05" +enable_date: "2025-05-05" +enable_flag: "enable_weak_ref" +disable_flag: "disable_weak_ref" +--- + +Enables the use of [`FinalizationRegistry`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry) and [`WeakRef`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef) built-ins. +* `FinalizationRegistry` allows you to register a cleanup callback that runs after an object has been garbage-collected. +* `WeakRef` creates a weak reference to an object, allowing it to be garbage-collected if no other strong references exist. + +:::note[Behaviour] +`FinalizationRegistry` cleanup callbacks may execute at any point during your request lifecycle, even after your invoked handler has completed (similar to `ctx.waitUntil()`). These callbacks do not have an associated async context — you cannot perform any I/O within them, including emitting events to a tail Worker. +::: + +:::caution +These APIs are fundamentally non-deterministic — the timing and execution of garbage collection are unpredictable, and you **should not rely on them for essential program logic**. Additionally, cleanup callbacks registered with `FinalizationRegistry` may **never be executed**, including but not limited to cases where garbage collection is not triggered, or your Worker gets evicted. +::: \ No newline at end of file