How can I free memory allocated by Rust code exposed in WebAssembly?

WebAssembly does not offer any instructions to deallocate memory, there is only the ability to increase the allocated size. Practically speaking, this means that the peak memory usage of your WebAssembly application is also the permanent memory usage.

For a given problem, it may be possible to tweak your algorithm to reduce the peak amount of memory.

I don't have the knowledge or ability to test this, but one out-of-the-box idea would be to try and have multiple WebAssembly runtimes distinct from each other. You could chew up a lot of memory in one to compute a relatively small result, serialize that result outside of the WASM runtime, then throw it away and spin up a new one. This is likely only to be useful in certain specific problem domains.


In the future, memory resizing may be re-added to WebAssembly. It was explicitly removed before the MVP release:

After the MVP, we are moving to things that diverge and cannot be polyfilled, and memory resizing makes more sense to add at that point in time.

  • Remove memory resizing from the MVP (294)
  • Only allow memory growth in MVP (389)

Thanks to alexcrichton and steveklabnik for answering this question in the Rust Discord.