我有一个从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');问题是C++代码中的内存泄漏,我们没有释放C代码内存分配的内存。最后,我们的堆空间用完了,它需要增加。堆数组是持久化的,并且在每次调用后不会像我最初想的那样被清除。
发布于 2014-04-09 14:27:58
我解决了这个问题。我不明白,如果您在C/C++程序中分配内存,将在JS中编译。我认为,在每个调用中,EMScripten都会生成新的清晰环境,但情况并非如此,环境将被重用。所以我们仍然关心内存泄漏。
https://stackoverflow.com/questions/22947843
复制相似问题