为什么不能在浏览器中构造“ WebAssembly.Memory”?

时间:2018-09-19 12:46:57

标签: 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

1 个答案:

答案 0 :(得分:0)

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

也许尝试运行ulimit -v unlimited来查看情况是否有所改善?