JavaScript 内存限制

IT技术 javascript memory browser
2021-03-11 19:21:48

JavaScript 应用程序可以存储的数据量是否有上限?

我猜这是由浏览器处理的,每个都有其局限性?

如果没有限制,是否会创建一个页面文件?如果是这样,那岂不是不安全?

6个回答

在 Chrome 和 Chromium OS 中,内存限制由浏览器定义,您可以在开发人员工具命令行中按 F12 使用以下命令检查限制:

> window.performance.memory.jsHeapSizeLimit
1090519040

在我的 Windows 10 操作系统上,它大约是 1 GB。

在 Chrom(e/ium) 上,您可以通过分配本机数组来绕过堆大小限制:

var target = []
while (true) {
    target.push(new Uint8Array(1024 * 1024)); // 1Meg native arrays
}

这会使选项卡在 2GB 左右崩溃,这发生得非常快。在那之后 Chrom(e/ium) 失控了,如果不重新启动浏览器就不可能重复测试。

我还建议您在深入研究尝试诊断或测量浏览器中任何内存相关的杂草之前阅读 TrackJS 的关于监控 JavaScript 内存的博文

您还可以在 comp.lang.javascript 中搜索javascript memory limit

另请参阅这些 Stack Overflow 帖子:

  1. Javascript 中数组的最大大小,这表明您最多可以存储 2 32 -1 = 4,294,967,295 = 42.9 亿个元素。

  2. JavaScript 函数可以接受的最大参数数

JS9 天文图像显示库网站上还有其他知识:处理内存限制

(我试图找到一个好的答案,这里提供的“没有上限”的答案对我来说只是愚蠢的。我不能遇到数百万美元项目的生产问题并向管理层说,“好吧,我认为没有上限,一切都会好起来的。”尝试进行概念验证,例如在您选择的 JavaScript UI 框架中加载大量组合框控件等。您可能会发现您的框架性能有所下降。 )

以下是我发现在 CPU 性能和内存性能方面都具有很好扩展性的一些组件:

  1. 微软摩纳哥编辑
    • 这被几个商业项目使用:
      1. 邮递员,从 v7.1.1-canary08 开始
      2. VS代码

以下是一些众所周知的性能下降的框架示例:

  1. Angular:糟糕的变化检测方法。
    • 对于每个异步事件,将每个绑定(Model-Dom 绑定)与其旧值进行比较,以决定是否重新渲染。
      1. NG1:> 2500 名观察者,性能停滞不前
      2. NG2:同样的问题仍然存在,但你有一个很长累人的解决方法:切换到不可变并在你的应用程序中传播 ChangeDetectionStrategy.onPush 以关闭默认的有问题的策略
  2. react
    • 同样,JS 对象的不可变集合目前只能扩展。
      1. create-react-app 内部使用的是 Immutable.JS,而 Immutable.JS 在它死之前只能创建大约 500k 个不可变集合。

这里还有一些其他的事情需要考虑:

  1. 使用array.slice 操作数组以最小化额外的数组分配;array.slice 将就地修改数组,这将减少垃圾收集和整体堆大小。
Chrome 会警告您链接到的网站存在恶意软件。也许从网站上获取信息并直接复制到这里而不是提供链接?
2021-04-28 19:21:48
自从我 7 年前最初写答案以来,我在去年重写了很多,环境发生了很多变化,例如 HTML5 和其他东西。
2021-05-06 19:21:48

AFAIK,没有上限,您的脚本基本上可以使用内存,直到系统耗尽内存(包括交换)。没有上限并不意味着你必须吃完它,用户可能不喜欢它。

Firefox 支持选项“ javascript.options.mem.max ”,如果您搜索该选项,您可以找到有关人们认为可行的合理值的讨论。

不知道有多少人会费心去那里设置它,但就我自己而言,我将它设置为 128000(即 128M)。

我不是 Mozilla 专家,但是source/dom/base/nsJSEnvironment.cpp#2308 -> source/dom/base/nsJSEnvironment.cpp#2169让我觉得这些单位是兆字节
2021-04-18 19:21:48

我认为内存限制来自浏览器。我们可以使用 DevTools 来解决这个问题。就像在 chrome 中一样,按 F12 并输入 window.performance.memory 你可以看到内存信息。

 window.performance.memory

在此处输入图片说明

Javascript 程序没有内存限制。您的脚本可以占用您机器上的所有 RAM。但是,不建议用完用户机器上的所有内存。如果您正在处理大量数据,我建议您检查缓存。

我意识到这些评论有点陈旧,但我已经构建了可以使用本机数组获得超过 4GB 可寻址内存的玩具原型,正如您在出色的回答@JohnZabroski 中提到的。
2021-04-15 19:21:48
我相信它实际上是 2Gb,至少在某些情况下是这样,所以假设 2GB,它在任何地方都可以正常工作
2021-04-16 19:21:48
@Pwpwpw 另外,我不知道约翰是否在说 Windows,而我不是。是的,我的答案更旧了,现在情况会有所不同。
2021-04-27 19:21:48
脚本不能占用机器上的所有 RAM。它仍将绑定到底层进程空间。因此,在 32 位浏览器上,只有 4GB 的可寻址内存。
2021-05-07 19:21:48
有人运行 32 位浏览器吗?他们已经预料到现代网页会在这台机器上分崩离析。
2021-05-12 19:21:48