我在我试过的所有浏览器中偶然发现了一些奇怪的行为:
-
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 回答
这听起来像是在操作系统中设置的限制 . 在64位系统上,浏览器为每个wasm内存对象保留6GB的虚拟内存(以避免在机器代码中进行边界检查) . 如果你的最大内存有限,你可能会遇到问题 . ulimit的输出显示每个进程限制为8GB的虚拟地址空间,这可能解释了这一点 .
也许尝试运行
ulimit -v unlimited
,看看这是否改善了这种情况?