我有一个从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']);
呼叫:
FS.createDataFile("/", "test.djvu", byteArray, true, true);
removeRunDependency();
var heapPointer = render('test.djvu');
FS.truncate('test.djvu', 0);
FS.unlink('test.djvu');
PS:
项目代码:https://github.com/saint3k/reader,experimental
分支。
reader-js中的索引文件。使用pre.js和post.js文件在a.out.js中编译代码。对于重建,请使用minidjvu文件夹中的./compile.sh。
答案 0 :(得分:1)
我解决了这个问题。我不明白,如果你在用JS编译的C / C ++程序中分配内存。您应该稍后释放它,我写了Module._free(heapPointer)。所以我认为在下一次调用时将使用所有HEAP,但这不正确。