Emscripten内存泄漏

Suk*_*lay 5 javascript memory-management emscripten

我有一个C用Emscritpen 编译的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每次尝试都需要HEAP放大,如果我每次尝试都做同样的事情.我不能在这里发布所有代码,因为它是来自大型库的功能.

PS:

在电话前的某个地方:

var render = Module.cwrap('render_djvu', 'number', ['string']);
Run Code Online (Sandbox Code Playgroud)

呼叫:

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

PS:

项目代码:https://github.com/saint3k/reader,C分支.reader-js中的索引文件.使用pre.js和post.js文件在a.out.js中编译代码.要重建,请在minidjvu文件夹中使用./compile.sh.

Suk*_*lay 0

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

  • 介意分享一下您的解决方案吗?我在不同的库中遇到了同样的问题。 (3认同)