Memory webassembly中的内存限制
webassembly程序的内存分配限制策略是什么 当前(硬)javascript引擎内存限制是否会被继承? 例如,是否有可能编写需要几百兆以上内存的实际应用程序 当前关于javascript内存分配的浏览器策略对浏览器中实际可行的内容提出了硬约束。 速度不再是emscripten/asm.js和jit编译的问题,但是内存限制使得在浏览器中构建任何严肃的应用程序变得困难或不可能 例如,请参见MeshLab网格处理系统的运行浏览器版本。对于桌面应用程序,主要限制是,在基于javascript的版本中,由于浏览器的js引擎对分配施加的固有限制,无法加载大型3D模型 WebAssembly有一个对象,二进制文件有一个。通过这些,开发人员提供关于最小和最大内存使用量的有根据的猜测,然后VM至少分配最小内存(或失败)。然后,开发人员可以在运行时要求更多的工具,比如Emscripten,在Memory webassembly中的内存限制,memory,browser,webassembly,Memory,Browser,Webassembly,webassembly程序的内存分配限制策略是什么 当前(硬)javascript引擎内存限制是否会被继承? 例如,是否有可能编写需要几百兆以上内存的实际应用程序 当前关于javascript内存分配的浏览器策略对浏览器中实际可行的内容提出了硬约束。 速度不再是emscripten/asm.js和jit编译的问题,但是内存限制使得在浏览器中构建任何严肃的应用程序变得困难或不可能 例如,请参见MeshLab网格处理系统的运行浏览器版本。对于桌面应用程序,主要限制是,在基于javascript的版本
malloc
的保护下使用这些工具(这有点类似于sbrk
)
对于asm.js,很难知道如何使用ArrayBuffer
,在某些32位平台上,您经常遇到进程碎片,这使得很难在进程的虚拟内存中分配足够的连续空间(在浏览器进程的虚拟地址空间中,ArrayBuffer
必须是连续的,否则会产生巨大的性能影响)。您可能会尝试分配256MB,但有时会出现硬失败。如果浏览器不是多进程的,这会变得非常困难,因为所有其他选项卡都在争夺32位的虚拟地址空间。浏览器,但32位并不多
WebAssembly由WebAssembly.Memory
支持,它是一种特殊类型的ArrayBuffer
。这意味着WebAssembly实现可以巧妙地处理ArrayBuffer
。在32位上没什么可做的:如果连续地址空间用完,虚拟机就做不了什么。但在64位平台上,没有足够的内存地址空间不足。浏览器实现可以选择防止您创建太多WebAssembly.Memory
实例(分配虚拟内存几乎是免费的,但不是完全免费的),但您应该能够获得一些4GiB分配。请注意,浏览器将仅虚拟分配该空间,并提交您所需的最小页数的物理地址。之后,它将仅在您使用grow\u memory
时进行物理分配。这可能会失败(物理内存大约和RAM的数量一样丰富,交换空间的大小也一样),但它的可预测性要高得多
一个实现可以在32位平台上使用类似的技巧(过度提交,但保持PROT_NONE
且不进行物理分配),假设碎片允许,但这取决于实现,以及它认为这会如何影响ASLR。实际上,当没有太多东西可供使用时,很难找到内存,但实际上是虚拟的和物理的
WebAssembly目前被指定为一个ILP32进程:指针是32位的。因此,您很难被限制为4GiB。我们可能会在将来添加它。我总结了一点以上的答案、注释和谷歌搜索的更多内容;有两个问题阻碍了将WebAssembly用于需要大量amo的项目内存大小:
- 当前的WebAssembly实现遵循32位寻址空间模型,因此在wasm64退出之前,不可能使用超过4gb的内存()
- 浏览器任意决定给一个页面的内存量。这(主要)是出于安全原因,因为人们喜欢认为网页比桌面应用程序更“安全”
实际上,我认为
WebAssembly.Memory
API与此无关。事实上,Wasm模块可以定义自己的内存,而asm.js总是从js导入内存,因此引擎无法区分用例。也就是说,js引擎中的内存限制主要不是由硬件造成的或者解决空间限制,但防止网页使用OOM杀死机器,这在某些操作系统上很容易。这也适用于Wasm。我不确定我们是否已经解决了这方面的任何问题。我们给出了什么