如何检测 JavaScript 中的内存限制?

2023-12-19

浏览器是否可以对 JavaScript 对象中存储的数据量施加任何类型的限制?如果是这样,有什么方法可以检测到该限制吗?

默认情况下,Firefox 似乎不会:

var data;
$("document").ready(function() {
  data = [];
  for(var i = 0; i < 100000000000; i++) {
    data.push(Math.random());
  }
});

这会继续消耗越来越多的内存,直到我的系统耗尽为止。

因为我们无法检测可用内存 https://stackoverflow.com/a/2027797/1454117,有没有其他方法可以告诉我们已经接近这个极限?

Update

我正在开发的应用程序依赖于非常快的响应时间才能使用(这是核心卖点)。不幸的是,它还有一个非常大的数据集(超出了较弱客户端计算机的内存容量)。通过策略性地抢先加载数据(猜测将点击什么)可以大大提高性能。当猜测不正确时,从服务器加载数据的后备工作会起作用,但服务器往返并不理想。充分利用每一块内存,使应用程序尽可能提高性能。

目前,它允许用户“配置”其性能设置(最大数据设置),但用户不想管理它。另外,由于它是一个网络应用程序,我必须处理用户对每台计算机的设置(因为功能强大的桌面比旧的 iPhone 有更多的内存)。如果它只使用系统上可用的最佳设置,那就更好了。但猜测过高也会导致客户端计算机出现问题。


虽然在某些浏览器上可能可行,但正确的方法应该是确定典型客户可接受的限制,并可选择提供 UI 来定义其限制。

大多数重型 Web 应用程序的 JavaScript 堆大小约为 10MB。似乎没有指南。但我认为在桌面上消耗超过 100MB,在移动设备上消耗超过 20MB 并不是很好。对于此后的所有内容,请查看本地存储,例如文件系统API http://www.html5rocks.com/en/tutorials/file/filesystem/(你完全可以让它持久)

UPDATE

这个答案背后的原因如下。几乎没有用户只运行一个应用程序。更重要的是指望浏览器只打开一个选项卡。最终,消耗所有可用内存从来都不是一个好的选择。因此没有必要确定上限。

用户想要分配给网络应用程序的合理内存量是一个猜测工作。例如。高度交互的数据分析工具在 JS 中是完全可能的,并且可能需要数百万个数据点。一种选择是默认使用较低的分辨率(例如,每天而不是每秒测量)或较小的窗口(一天与十年的秒)。但随着用户不断探索数据集,将需要越来越多的数据,这可能会削弱代理端的底层操作系统。

好的解决方案是采用一些合理的初始假设。我们打开一些流行的Web应用程序,进入开发工具-配置文件-堆快照看一下:

  • 脸书:18.2 MB
  • G 邮件:33 MB
  • 谷歌+:53.4 MB
  • YouTube:54 MB
  • 必应地图:55 MB

注意:这些数字包括堆上的 DOM 节点和 JS 对象。

似乎从那时起,人们开始接受 50MB RAM 来构建一个有用的网站。(2022 年更新:现在平均接近 100MB。)构建 DOM 树后,用测试数据填充数据结构,并查看 RAM 中可以保留多少数据。

顺便说一句,在 Chrome 中启用设备模拟时使用类似的测量方法,可以看到平板电脑和手机上相同网站的使用情况。

这就是我在桌面上获得 100 MB 以及在移动设备上获得 20 MB 的方法。似乎也有道理。当然,对于偶尔的重度用户来说,如果能够选择将最大堆增加到 2 GB,那就太好了。

现在,如果每次从服务器提取所有这些数据成本太高,您该怎么办?

一件事是使用应用程序缓存。它确实会造成轻微的版本管理麻烦,但允许您存储大约 5 MB 的数据。不过,将应用程序代码和资源保存在其中比存储数据更有用。

除此之外,我们还有三个选择:

  • SQLite https://caniuse.com/sql-storage - support was limited and it seems to be abandoned
  • IndexDB - better option but support is not universal yet (can I use it?) http://caniuse.com/indexeddb
  • 文件系统API http://www.html5rocks.com/en/tutorials/file/filesystem/

Of them, FileSystem is most supported and can use sizable chunk of storage http://www.html5rocks.com/en/tutorials/offline/quota-research/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测 JavaScript 中的内存限制? 的相关文章