如何检测 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 中的内存限制? 的相关文章

随机推荐

  • 将无符号字符转换为有符号整数

    我有一个 unsigned char 数组 其中有 2 个元素代表有符号整数 如何将这 2 个字节转换为有符号整数 Edit unsigned char 数组采用小端字节序 为了获得最大的安全性 请使用 int i signed char
  • 使用python多处理库让父进程在子进程之前返回

    当使用 python 的多处理库创建进程时 父进程会等待其子进程返回 然后再返回 事实上 文档建议所有儿童都加入 但我想让父母回来before它的子进程完成 有没有办法 分离 子进程 我知道使用 subprocess Popen 可以创建分
  • Amazon Cognito 托管 UI 无法通过 iframe 实现?

    我尝试过 但在标题中X Frame Options deny我没有找到任何方法在后端 UI 中配置它 我不确定这有多少 答案 但我还没有足够的声誉来发表评论 我认为这是相关的 接受的答案根本没有真正解决 iframe 问题 我在任何地方都找
  • 如何:在 Windows Compact Framework 上从非托管 C++ 调用托管 C# 接口

    我有大量的非托管 Windows CE 5 C 代码 它提供了一个我想在新产品中使用的 UI 方法是将其与在 Windows CE 6 和 Compact Framework 上用托管 C 编写的大量较新的业务和通信逻辑相结合 UI 可能了
  • java8流样式通过字段列表检索映射的内部部分?

    例如 给定如下所示的地图 k1 k2 k3 k4 v 和一个字段列表 k1 k2 k3 我需要检索该部分 k4 v 下面是我的java7风格的代码 Ignore the map building code Map map1 new Hash
  • 根据 R 中的条件重命名因子级别

    我想将所有计数小于 n 的因素合并为一个名为 Else 的因素 例如 如果 n 3 那么在下面的 df 中我想将 c d 和 e 组合为 Else df data frame x c 1 10 y c a a a b b b c d d e
  • 多个oracle查询问题

    我正在尝试从 NET 页面运行查询 但似乎在进行多个查询时遇到一些问题 我的查询与此类似 SELECT FROM table1 SELECT from table2 但从 Net 页面执行此操作时 我似乎收到无效字符错误 它在 SQL De
  • 在 SwiftUI 中获取 ForEach 中的索引

    我有一个数组 我想迭代它根据数组值初始化视图 并想根据数组项索引执行操作 当我迭代对象时 ForEach array id self item in CustomView item item tapAction self doSomethi
  • 获取 CodeElement 的 Access 属性

    我正在为 VS 2010 编写一个插件 无法找到问题的答案 如何获取 CodeElement 的 Access 属性 如果有该属性 我试图反思 但没有结果 前任 CodeElement 是一个类方法 public void GetAcces
  • 在 Zend Framework 2 上使用表达式执行多重连接

    实际上我正在开发一个项目 我正在研究 Zend Framework 2 如何处理复杂的查询 特别是如何连接 n m 表以及如何使用 GROUP CONCAT 和其他函数 您知道执行此查询的最佳实践吗 SELECT o x group one
  • 将 Pandas Dataframe 写入_csv StringIO 而不是文件

    此代码的目标是将现有的 CSV 文件从指定的 S3 存储桶读取到 Dataframe 中 过滤 Dataframe 中所需的列 然后写入filtered使用 StringIO 将数据帧转换为 CSV 对象 我可以将其上传到不同的 S3 存储
  • 在没有先验消息类型知识的情况下解析 HL7

    在 NHapi 中 如果我们不知道消息类型 MSH 9 是什么 我们如何解析消息 var parser new NHapi Base Parser PipeParser IMessage parsedMessage parser Parse
  • 编写 MSMQ 示例应用程序所需的最低限度

    我已经研究了一个多小时 找到了如何在 C 中使用 MSMQ 的优秀示例 甚至找到了一本关于消息队列的书的完整章节 但是为了快速测试 我需要的只是涵盖这个场景 甚至不需要以完美的方式 只是为了快速演示 应用程序A 将消息写入消息队列 应用程序
  • 限制 SQL Server 登录只能访问一个数据库

    我有一个SQL Server服务器上有大约 50 个数据库 我希望创造一个新的Login对于希望访问其数据库的客户 但我不想让他们访问其他人49 个数据库 我怎样才能做到这一点 我认为这是我们非常喜欢做的事情 Step 1 create a
  • npm命令问题

    我已经在我的系统上安装了 Node js Windows 7的 我已将环境路径变量设置为 C Users pUser AppData Roaming npm node modules npm users 文件夹中有一个 npmrc 文件 其
  • 在哪里可以找到 vuetify 中使用的图标列表? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您可以添加一个图标 例如
  • Powershell 和 schtask 以及具有空格的任务

    我正在使用schtask使用 PowerShell 命令 出现的问题是 当程序 脚本参数包含C Program Files 它认为路径只是C Program路径的其余部分是一个参数 我试图通过使用来逃避它 场前和场后 但没有什么区别 我怎样
  • 如何在折叠工具栏布局下添加 viewpager 和 tablayout

    我尝试了该问题的所有解决方案stackoverflow但我没有得到任何帮助 首先 我想实现这样或类似的布局 根据一些问题stackoverflow like this https stackoverflow com questions 36
  • 获取 'Context 是不可构造的。添加默认构造函数或提供 IDbContextFactory 的实现。”

    当我尝试使用代码优先迁移时出现此错误 我的上下文有一个带有连接名称的构造函数 public class VeraContext DbContext IDbContext public VeraContext string NameOrCon
  • 如何检测 JavaScript 中的内存限制?

    浏览器是否可以对 JavaScript 对象中存储的数据量施加任何类型的限制 如果是这样 有什么方法可以检测到该限制吗 默认情况下 Firefox 似乎不会 var data document ready function data for