我有一个使用 Emscritpen 从 C
编译的 javascript 函数,它使用了一些内存(大约 8mb),我需要经常调用它。 (每 20 秒调用一次)。
但每次调用后,使用的内存量都会增加。最终它开始失败:
无法扩大内存阵列。 (1) 使用 -s TOTAL_MEMORY=X 进行编译,X 高于当前值 100663296,(2) 使用 ALLOW_MEMORY_GROWTH 进行编译,它会在运行时调整大小但会阻止某些优化,或者 (3) 在程序运行之前设置 Module.TOTAL_MEMORY。
如果我增加内存量,它可以工作更长时间,但最终还是会失败。我不明白为什么 EMScripten 会在每次调用后尝试扩大 HEAP 大小。
一些代码示例:
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 代码分配的内存。最终我们用完了堆空间,需要增加空间。 HEAP 数组是持久的,并且不会像我最初认为的那样在每次调用后被清除。
最佳答案
我解决了这个问题。我不明白如果你在将在 JS 中编译的 C/C++ 程序中分配内存。我虽然在每次调用时 EMScripten 都会生成新的清晰环境,但事实并非如此,环境将被重用。所以我们还是关心内存泄漏。
关于javascript - Emscripten内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22947843/