了解Emscripten跟踪集电极输出

问题描述 投票:0回答:1

我使用的是trace API in emscripten检查内存分配在我的代码。

trace allocator概述,“分配摘要”总是不断增加,到GB,而“内存使用”低于50MB稳定。当在单个帧看,“黄金”和“自由”的数量是相同的(除了在启动时),但分配和释放的字节数是没有的。

我在读这错了吗?这是痕迹的配置有问题?

emscripten
1个回答
0
投票

所有的奇怪的事情发生,因为你不能使用JS引擎系统工具真的跟踪WebAssembly(或Emscripten)的内存分配。换句话说,堆由WebAssembly用户代码管理,而不是由发动机JS等V8。

你可能要检查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()的,而主机系统中,这个上下文-the JS引擎不知道堆的内部发生了什么。

所以,不管你有多少分配和释放堆您Emscripten代码中,在V8的角度内存使用量将保持稳定,因为它已经被分配了整个ArrayBuffer并一语道破到Emscripten实例。

唯一的例外是,WebAssembly实例可以请求JS引擎increase the size of the ArrayBuffer,因为它需要更多的堆,就像在sbrk C / C ++上下文。所以JS引擎只分配趋于增长,直到它到达的WebAssembly.Memory()您(或Emscripten完成自动生成的JS代码)指定的最大尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.