WebAssembly 处理音视频时内存泄漏怎么排查?

A. 耘郗 阅读 79

我用 Emscripten 把 FFmpeg 编译成 wasm,在浏览器里解码 H.264 视频流,但每次播放完内存占用都不释放,Chrome 任务管理器里显示页面内存一直在涨。试过调用 Module._free(ptr) 释放指针,也检查了 C 代码里的 malloc 都有对应 free,还是不行。

是不是 wasm 模块本身的堆没清理?或者 JS 和 wasm 之间传 buffer 有引用没断开?求有经验的大佬指点下排查方向!

const videoData = new Uint8Array(arrayBuffer);
const ptr = Module._malloc(videoData.length);
Module.HEAPU8.set(videoData, ptr);
// ... 调用解码函数
Module._free(ptr); // 这样释放应该没问题吧?
我来解答 赞 12 收藏
二维码
手机扫码查看
2 条解答
园园
园园 Lv1
省事的话,先用 Chrome DevTools 的 Memory 面板录个 heap snapshot,重点看 JS 和 wasm 交互的 ArrayBuffer 对象有没有被释放。记得检查解码后的 frame buffer 是否也被正确 free 了,有时候 C++ 析构函数没调用也会导致内存泄漏。代码里试试在每次解码前手动调用一下 GC.Collect(),虽然不优雅但能帮你定位问题。
点赞
2026-03-29 16:09
打工人尚昆
试试这个,确保所有通过 Module._malloc 分配的内存都调用了 Module._free,同时检查是否有全局变量或闭包持有对这些内存的引用,导致无法释放。可以使用 Chrome 的开发者工具中的 Memory 面板进行堆快照对比,找出未释放的对象。
点赞
2026-03-24 20:01