javascript - 为什么我不能在浏览器中构造 `WebAssembly.Memory`?

标签 javascript linux memory browser webassembly

我在我尝试过的所有浏览器中都偶然发现了一些奇怪的行为:

  • Chromium 69.0.3497.92(官方版本)Arch Linux(64 位)
  • Chrome 69.0.3497.100(官方版本)(64 位)
  • Firefox 62.0(64 位)

当我尝试通过实例化 WebAssembly.Memory 对象为 WebAssembly 分配内存时,例如这样:

new WebAssembly.Memory({ initial: 1 })

在 Chrome/Chromium 中,我得到:

VM274:1 Uncaught RangeError: WebAssembly.Memory(): could not allocate memory
    at <anonymous>:1:1
(anonymous) @ VM274:1

在 Firefox 中,我得到:

Error: out of memory 

分配在 Node.js 中工作得很好,但由于某种原因,我所有的浏览器在这里都失败了。我不知道该怎么办,所有依赖 WebAssembly 的网站都对我无法使用。

我怀疑 Linux 正在阻止浏览器(但不是 node.js?)分配内存,但这只是一个疯狂的猜测。在另一台计算机上几乎相同的安装工作正常,但在这台特定的计算机上,浏览器的每次分配都会失败。

有人知道怎么回事吗?

这是我的 ulimit -a 输出:

-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         unlimited
-m: resident set size (kbytes)      unlimited
-u: processes                       31215
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  16384
-v: address space (kbytes)          8388608
-x: file locks                      unlimited
-i: pending signals                 31215
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 99
-N 15:                              unlimited

最佳答案

这听起来像是在您的操作系统中设置的限制。在 64 位系统上,浏览器为每个 wasm 内存对象保留 6GB 的虚拟内存(以避免机器代码中的边界检查)。如果您的最大内存有限,您可能会遇到问题。 ulimit 的输出显示每个进程的虚拟地址空间限制为 8GB,这可能解释了这一点。

也许尝试运行 ulimit -v unlimited 看看这是否能改善情况?

关于javascript - 为什么我不能在浏览器中构造 `WebAssembly.Memory`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52406217/

相关文章:

javascript - 更改单击事件时按钮的颜色

javascript - 通过索引jquery获取数组值

java - Ubuntu:OpenJDK 8 - 无法找到包

objective-c - 当我在 Obj-C 中定义一个不带 @property 的成员时,向该成员传递值时的操作是什么?

memory - 哪种 channel 类型在 Go 中使用最少的内存?

javascript - 对象方法不是函数

javascript - 如何使用带样式的组件来设置组件打印的样式?

linux - GAWK:strftime() 的逆函数 - 使用格式模式将日期字符串转换为纪元时间戳后的秒数

linux - 在 modprobe.conf 中订购相同类型、相同产品 ID 和相同供应商 ID 的多张卡

C++:缓存 JSON 而不是对象会减少内存消耗吗?