JavaScript内存限制

69

JavaScript应用程序能存储的数据量是否有限制?

我猜这个取决于浏览器,每个浏览器都有自己的限制吧?

如果没有限制,那么会创建页面文件吗?如果是这样,那不安全吗?


3
有一些限制,尽管这些限制取决于浏览器。例如,Firefox 在堆栈空间和过度的 CPU 消耗方面存在限制。 - Rushyo
6个回答

51

在 Chrome 和 Chromium OS 中,内存限制由浏览器定义,您可以通过在开发者工具命令行中使用以下命令来检查该限制(按 F12 键):

> window.performance.memory.jsHeapSizeLimit
1090519040

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

在 Chrome/Chromium 上,您可以通过分配本地数组来避免堆大小限制:

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

这会在大约2GB处崩溃,这非常迅速。之后Chrom(e / ium)会失控,并且重新运行测试是不可能的,除非重启浏览器。

我还建议在您深入研究或测量浏览器中任何与内存相关的内容之前阅读TrackJS的博客文章“Monitoring JavaScript Memory”

您也可以搜索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. Microsoft Monaco编辑器
    • 这被多个商业项目使用:
      1. Postman,在v7.1.1-canary08版本中
      2. VS Code

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

  1. 角度:较差的更改检测方法。
    • 对于每个异步事件,将Model-Dom绑定的每个绑定与其旧值进行比较,以决定是否重新渲染。
      1. NG1:> 2500个监视程序,性能降至停顿
      2. NG2:问题仍然存在,但您需要长时间的解决方法:切换到不可变并在整个应用中使用ChangeDetectionStrategy.onPush来关闭默认的有问题的策略。
  2. 反应
    • 同样,JS对象的不可变集合只能扩展到一定程度。
      1. create-react-app内部使用Immutable.JS,而Immutable.JS最多只能创建约500k个不可变集合。

以下是一些其他需要考虑的事项:

  1. 使用

Chrome警告您链接的网站存在恶意软件。也许直接从该网站复制信息到这里,而不是提供链接? - jasop
2
在我最初写下这个答案的7年里,我已经多次重写了它,因为在这段时间里,很多事情发生了变化,比如HTML5和其他一些东西。 - John Zabroski

39

据我所知,没有上限,您的脚本基本上可以使用内存,直到系统耗尽内存(包括虚拟内存)。没有上限并不意味着您必须全部使用,用户可能不喜欢这样。


7
火狐浏览器支持选项“javascript.options.mem.max”,如果你搜索相关内容,你可以找到人们讨论过的合理值。不确定有多少人会去设置它,但就我个人而言,我将其设置为128000(即128M)。

1
我不是Mozilla专家,但是source/dom/base/nsJSEnvironment.cpp#2308 -> source/dom/base/nsJSEnvironment.cpp#2169让我认为单位应该是兆字节。 - ジョージ

5

我认为内存限制来自于浏览器。我们可以使用DevTools来查找问题。比如在Chrome中,按F12并输入window.performance.memory,您可以看到内存信息。

 window.performance.memory

enter image description here


3

Javascript程序没有内存限制。你的脚本可以占用机器上的所有RAM。然而,不推荐使用用户机器上的全部内存。如果你处理了大量数据,建议考虑缓存。


4
脚本无法独占计算机上的所有 RAM。它仍然会受限于底层进程空间。因此,在32位浏览器上,RAM 的可寻址内存只有4GB。 - John Zabroski
1
我相信实际上是2GB,至少在某些情况下是这样的,所以假设是2GB,它将在任何地方都可以正常运行。 - CoffeDeveloper
1
我意识到这些评论有点旧了,但是我已经构建了玩具原型,可以使用本地数组获得超过4GB的可寻址内存,正如你在你出色的回答中提到的那样,@JohnZabroski。 - Pwpwpw
@Pwpwpw 另外,我不知道 John 是否在谈论 Windows,而我没有。是的,我的答案比较旧,现在情况可能会有所不同。 - Secko
有人在使用32位浏览器吗?他们已经预料到现代网页在那台机器上会出现问题了。 - doug65536

2
这可能因不同的网络浏览器而异,从观察中,我发现在Chrome(版本79.0.3945.130)中,每个任务的最大值为2Gb。Chrome调试器会在“潜在的内存溢出崩溃前暂停”消息出现时暂停网页。
然而,调试器允许恢复网页操作(通常导致网页崩溃),但如果没有崩溃,则使用的内存可以爬升到超过2Gb,网页通常会在这一点之后表现得更慢。似乎每个任务都设置了2Gb的限制。
例如:我开发了一个实时的基于Web的日志查看器,显示从某些本地日志文件读取的日志信息。您可以请求查看日志文件的百分比。一些日志文件很大,可以包含10万行以上。当请求查看所有这些行时,Chrome将崩溃,但如果我请求每次查看10000行,就完全没有问题了。这使我得出了“每个任务的最大2Gb”结论。
这只是一种理论,如果有错误请指正。请参阅附加的图片。

enter image description here

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接