- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
WebAssembly 程序的内存分配限制政策是什么?
是否会继承当前的(硬)javascript 引擎内存限制?例如。是否可以编写需要数百兆内存的实际应用程序?
当前关于 javascript 内存分配的浏览器策略对浏览器中实际可执行的操作提出了严格的限制。速度不再是 emscripten/asm.js 和 jit 编译的问题,但是内存限制使得在浏览器中构建任何严肃的应用程序变得困难或不可能。
参见示例 http://www.meshlabjs.net , MeshLab 网格处理系统的浏览器运行版本。对于桌面应用程序,主要限制是,在基于 javascript 的版本中,由于浏览器的 js 引擎对分配的内在限制,无法加载大型 3D 模型。
最佳答案
WebAssembly 有一个 WebAssembly.Memory
对象和二进制文件有 memory section .通过这些,开发人员提供了关于最小和最大内存使用的有根据的猜测,然后 VM 至少分配最小值(或失败)。然后,开发人员可以在运行时通过 grow_memory
询问更多信息。像 Emscripten 这样的工具将在 malloc
的底层使用(它有点类似于 sbrk
)。
对于 asm.js,很难知道 ArrayBuffer
将如何使用,并且在某些 32 位平台上,您经常会遇到进程碎片,这使得分配足够的连续空间变得困难在进程的虚拟内存中(ArrayBuffer
必须在浏览器进程的虚拟地址空间中是连续的,否则你会遇到巨大的性能损失)。您会尝试分配 256MiB,有时会出现硬故障。如果浏览器不是多进程的,这将变得非常困难,因为所有其他选项卡都在竞争 32 位虚拟地址空间。浏览器 were a bit silly a few years ago, they got better ,但 32 位并没有什么好转的。
WebAssembly 由 WebAssembly.Memory
支持,它是 ArrayBuffer
的一种特殊类型。这意味着 WebAssembly 实现可以巧妙地处理该 ArrayBuffer
。在 32 位上没有什么可做的:如果你用完了连续的地址空间,那么 VM 就无能为力了。但在 64 位平台上,有大量的地址空间。浏览器实现可以选择阻止您创建过多的 WebAssembly.Memory
实例(分配虚拟内存几乎是免费的,但不是完全免费的),但您应该能够获得几个 4GiB 分配。请注意,浏览器只会虚拟分配该空间,并为您说需要的最少页面提交物理地址。之后它只会在您使用 grow_memory
时进行物理分配。这可能会失败(物理内存与 RAM 的数量差不多,提供或获取交换空间),但它更更可预测。
假设碎片允许,实现可以在 32 位平台上使用类似的技巧(过度提交但保持 PROT_NONE
并且未物理分配),但这取决于实现及其如何认为影响 ASLR。实际上,当没有太多事情可以去时,很难找到内存,但实际上和物理上。
WebAssembly 当前被指定为 ILP32 进程:指针为 32 位。因此,您被硬限制为 4GiB。我们可以添加 wasm64 future 。
关于WebAssembly 中的内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40417774/
我在 WebAssembly 中看到的每个数据部分示例都使用字符串,即 (data (i32.const 16) "Hello World") 如何将这些部分与二进制数据一起使用?我怎么能做一些等同于
详细介绍 WebAssembly 的主要站点,https://webassembly.org/ ,自 1.0 版发布以来似乎没有更新,甚至是功能路线图。 docs on MDN好像也好不到哪里去,th
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
例如,C 没有与 Rust 相同的安全解决方案,但是用 Rust 编写的 WebAssembly 是否具有 Rust 的优点? 用 Rust 编写并转换为 WebAssembly 的程序会比用 C 编
垃圾收集语言,例如 Go 和 AssemblyScript,需要随应用程序一起提供运行时来处理垃圾收集。这导致比没有垃圾收集的语言更大的二进制大小。编译为 WebAssembly 的各种语言的二进制大
Webassembly 仅提供一种更高级的浮点运算:平方根。 它没有任何其他通常在 CPU 中实现的功能,例如幂和三角函数,官方常见问题解答中解释了这一基本原理: WebAssembly doesn’
有人可以分享语法来静态创建具有某些元素的表并引用它吗?我找不到这样做的任何 Web 程序集代码。 还有一些细节,比如我可以有多个列,如果索引不在表中会发生什么等会有所帮助吗? 最佳答案 (针对 202
有人可以分享语法来静态创建具有某些元素的表并引用它吗?我找不到这样做的任何 Web 程序集代码。 还有一些细节,比如我可以有多个列,如果索引不在表中会发生什么等会有所帮助吗? 最佳答案 (针对 202
即一方面,预编译代码更难阅读,因此更难以有意义地更改浏览器代码。 它如何比 JS 更“沙盒化”,这是否使它不那么容易被破解? “WebAssembly 被指定在安全的沙盒执行环境中运行。” - htt
https://webassembly.github.io/demo/说:“实现了完整的执行语义。”听起来 MVP 已经完成,但到底缺少什么,或者我做错了什么? 浪费: (module (me
我正在试验 WASM,我想将图片编码为 WebP 以学习 WASM。 我正在尝试编译 libwebp到单个 mjs 文件中。具体来说,encoding utility .我正在使用 Emscripte
我的问题类似于this one ,但不是属于 Blazor server 应用程序,我在 Blazor webassembly 应用程序的上下文中询问。我意识到在这个浏览器执行上下文中只有一个 (UI
我想使用这个很棒的包:https://github.com/hpcc-systems/hpcc-js-wasm它将 Webassembly (graphizlib.wasm) 与要使用的 Javasc
没有使用 indirect_call 的例子可在线使用。基于语义文档,我试过 (call_indirect (i32.const 0) (i32.const 0) ) 数字是随
我需要将 wasm 应用程序直接嵌入到 html 页面本身,而不是从单独的文件中加载它(例如通过 xhr)。到目前为止,我设法通过将字节直接“打印”到 Uint8Array 中来嵌入它(见下文),但它
我需要一个 WebAssembly 的“br_table”指令示例,因为我不知道如何直接以 WebAssembly 文本格式使用该指令。 就像下面的代码,我看不出它的构造结构对应的是哪一部分。哪一部分
是否有任何工具(目前)可以将 wasm 模块编译为 native 可执行文件(例如 ELF 或 .exe 文件)?类似 emscripten 的东西,但反过来。如果做不到这一点,有没有其他方法可以在浏
我尝试了 Blazor Webassembly。我在 Visual Studio 中创建了一个新的 Blazor Webassembly 项目。这为我们提供了一个基本的示例项目,其中包含可以通过单击增
我刚刚开始研究 WebAssembly MVP,并注意到无法访问堆栈和堆栈指针,或者实际上没有任何结构化异常处理支持(抛出/捕获)等。 鉴于它应该是一个 C 编译目标,它肯定可以实现 setjmp 和
在 Uno Platform for WebAssembly 中实现 URL 深度链接的任何线索或方向? 我看到它在以下项目中实现,可以在 https://platform.uno/showcases
我是一名优秀的程序员,十分优秀!