我正在使用trace API in emscripten检查代码中的内存分配。
在trace allocator概述中,“分配摘要”总是增加到GB,而“内存使用量”稳定在50MB以下。当查看各个帧时,“ Alloc”和“ Free”的数目相同(启动时除外),但是分配和释放的字节数却不同。
我读错了吗?这是轨迹配置中的问题吗?
答案 0 :(得分:0)
发生所有奇怪的事情是因为您无法真正使用JS引擎系统工具来跟踪WebAssembly(或Emscripten)的内存分配。换句话说,堆是由WebAssembly用户代码管理的,而不是由像V8这样的JS引擎管理的。
您可能要检查my explanation of the WebAssembly memory。 WebAssembly具有一个称为WebAssembly.Memory
的线性存储器区域。实际上,这是一个大的JS ArrayBuffer WebAssembly.Memory.buffer,这是WebAssembly模块可以按设计触摸的唯一内存区域(堆栈除外)。尽管WebAssembly无法触摸单个ArrayBuffer之外的任何内存,但是它可以使用此缓冲区执行任何操作。因此,大多数WebAssemlby二进制文件都将缓冲区用作堆区域。
WebAssembly 1.0没有指定任何内置的用户库,包括内存管理。这意味着编译到WebAssembly的每个C / C ++代码都必须具有自己的malloc()
实现,而主机系统(在这种情况下为JS引擎)不知道堆内部发生了什么。
因此,无论您在Emscripten代码中分配和释放了多少堆,在V8透视图中,内存使用将保持稳定,因为它已经分配了整个ArrayBuffer并分配给Emscripten实例。
唯一的例外是,WebAssembly实例可能需要JS引擎increase the size of the ArrayBuffer,因为它需要更多的堆,就像C / C ++上下文中的sbrk
一样。因此,JS引擎分配只会趋于增长,直到达到您指定的WebAssembly.Memory()
(或Emscripten自动生成的JS代码)的最大大小为止。