Emscripten memory leak

Emscripten memory leak

本文关键字:leak memory Emscripten      更新时间:2023-09-26

我有一个使用Emscritpen从C编译的javascript函数,它使用一定量的内存(大约8mb),我需要经常调用它。(每 20 秒呼叫一次)。

但是每次调用后,使用的内存量都会增加。最终它开始失败:

Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value 100663296, (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.

如果我增加内存量,它会工作更长时间,但最终仍然失败。我不明白为什么 EMScripten 在每次调用后都试图扩大堆大小。

一些代码示例:

var render = Module.cwrap('render_djvu', 'number', ['string']);

叫:

FS.createDataFile("/", "test.djvu", byteArray, true, true);
removeRunDependency();
var heapPointer = render('test.djvu');
FS.truncate('test.djvu', 0);
FS.unlink('test.djvu');

UP:问题是C++代码中的内存泄漏,我们没有释放由 C 代码分配的内存。最终,我们的堆空间不足,需要增加。堆数组是持久的,并且不会像我最初认为的那样在每次调用后清除。

我解决了这个问题。我不明白,如果你在 C/C++ 程序中分配内存,该程序将以 JS 编译。我认为在每次调用时EMScripten都会生成新的清晰环境,但事实并非如此,环境将被重用。所以我们仍然关心内存泄漏。