window.URL.revokeObjectURL() 不会立即释放内存(或根本不释放内存)?

2024-01-11

我正在制作一个 html 界面,通过拖放和多个选择文件将图像上传到服务器上。我想在将图片发送到服务器之前显示它们。所以我首先尝试使用FileReader但我遇到了一些问题,比如这个帖子 https://stackoverflow.com/questions/6217652/html5-file-api-crashes-chrome-when-using-readasdataurl-to-load-a-selected-image/6298889#6298889。所以我改变了我的方式,我决定使用 blob:url 就像 ebidel 在帖子中推荐的那样,window.URL.createObjectURL() and window.URL.revokeObjectURL()来释放内存。

但现在,我遇到了另一个问题,类似于this one https://stackoverflow.com/questions/7167180/understanding-object-urls-for-client-side-files-and-how-to-free-the-memory。我希望客户如果愿意的话可以一次上传 200 张图片。但是浏览器崩溃了,并且使用的内存非常高!所以我认为可能同时显示的图像太多了,我使用数组设置了一个带有文件等待队列的系统,以便一次只处理 10 个文件。但问题仍然出现。

在 Google Chrome 上,如果我检查chrome://blob-internals/文件(通常已经由window.URL.revokeObjectURL())大约在 8 秒延迟后释放。在 Firefox 上我不确定,但似乎这些文件没有发布(我检查了about:memory-> 图像)

是我的代码不好,还是它是一个独立于我的问题?有没有办法强制导航器立即释放内存?如果它可以帮助的话,这是 JavaScript 中出现问题的部分:链接已过期,因为问题中未包含代码.

EDIT

这是一种自己的答案+对 bennlich 的答案(评论文本太长)

我从 user1835582 的回答中了解到,我确实可以删除 Blob/File,但是当浏览器需要图像时,它将它们保留在内存中的某个位置(这是合乎逻辑的)。因此,事实上是显示图像(很多且很重)导致我崩溃和速度变慢,而不是revokeObjectURL方法。此外,每个浏览器都以自己的方式管理内存,从而导致不同的行为。我是这样得出这个结论的。

首先,让我们尝试一下revokeObjectURL效果很好,有一个使用源代码的简单示例https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications#Example.3A_Using_object_URLs_to_display_images https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications#Example.3A_Using_object_URLs_to_display_images。 使用 Chrome,您可以通过检查来验证 Blob 是否已被撤销chrome://blob-internals/或者尝试将显示的图像打开到一个空白的新选项卡中。注意:要完全释放 Blob 引用,请添加document.getElementById("fileElem").value = ""。几年前,当我发布问题时,释放 blob 大约需要 8 秒,现在几乎是立即的(可能是由于 Chrome 的改进和/或更好的计算机)

然后,进行充电测试。我用了一百张 jpg,每张大约 2.5 Mo。显示图像后,我滚动页面。 Chrome 崩溃了,Firefox 运行缓慢(未在其他浏览器上测试过)。然而当我评论的时候li.appendChild(img)一切都很顺利,即使有大量图像。这表明问题并非来自revokeObjectURL方法实际上可以正常工作,但是由于显示大量的图像而导致。您还可以测试创建一个包含数百个沉重图像的简单 html 页面,然后滚动它 => 相同的结果(崩溃/减慢)。

最后,为了更深入地了解图像内存管理,在 Firefox 上查看 about:memory 很有趣。例如,我看到当窗口处于活动状态时,Firefox 会解压缩图像(图像 -> 未压缩堆上升),而原始数据(图像 -> 原始数据)始终稳定(相对于加载的图像数量)。这里有关于内存管理的很好的讨论:http://jeff.ecchi.ca/blog/2010/09/19/free-my-memory http://jeff.ecchi.ca/blog/2010/09/19/free-my-memory.


With window.URL.revokeObjectURL()你只能得到[Blob] or [File]目的。您不能强制从内存中删除。

Note.浏览器尚未最终确定,它们可能会从这些设施中泄漏。如果您实现动画,则必须自行承担风险来理解它。

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

window.URL.revokeObjectURL() 不会立即释放内存(或根本不释放内存)? 的相关文章

  • 如何从字符串调用并执行运算符?

    例如 var s 3 3 s replace d g function all n1 operator n2 r new Number n1 new Number n2 return r 注意 不使用eval 变量运算符可以吗 https
  • 在TestCafé测试中注入的injectScripts中的脚本在哪里?

    我正在以编程方式设置 TestCaf 测试 并且使用injectScripts配置上Runner类来注入函数 根据文档 这些脚本被添加到测试页面的标题中 是否可以从测试本身调用函数 我还没有找到办法做到这一点 我可以看到脚本映射在测试中是可
  • 读取 Nashorn JO4 和 NativeArray

    Java调用代码 import jdk nashorn api scripting myCustomHashMap dataStore new myCustomHashMap ScriptEngineManager sem new Scri
  • Chrome 打包应用程序 - 在后台/事件页面中使用 AngularJS

    当我们创建 Chrome 应用程序时 我们将脚本放在背景属性中清单 json file 这将用作应用程序的背景 事件页面 我想要的是 我想使用 AngularJS后台脚本但我不知道怎么办 还有 这可能吗 我刚看到一些答案 https sta
  • 在 Javascript 中缓存和预取过期的 Promise

    Promise 是我在 Javascript 中管理异步代码的首选方式 Memoize npm 上的 memoizee 是一个 Javascript 库 用于轻松缓存和预取函数结果 理想情况下 我想结合两者的优点 并且能够使 Promise
  • 如何使子元素被访问/活动时父元素的颜色发生变化

    我有一个下拉导航 我想要做的是 当我单击任何子菜单链接时 我希望父按钮的颜色在链接处于活动状态时保持更改 这是代码的小提琴链接 https jsfiddle net v28ydshL https jsfiddle net v28ydshL
  • JavaScript 按属性删除对象数组中的元素

    我有一个以下形式的对象数组 prop1 value1 banks id value property2 value2 所以我想要做的是通过搜索 id 值来删除 banks 属性中的元素 然后从banks数组中删除找到的元素 id 属性具有唯
  • 两列宽度可变且它们之间的间隙固定

    我需要动态设置两列的样式 它们各自的宽度应为 50 但它们之间的固定间隙为 10px 当我折叠菜单时 列应加宽至可用空间 并且间隙应保持 10 像素 因此 列不能采用固定宽度 我试过这个 container background red w
  • 如何从此 d3.js layout.tree 获取树祖先和树后代的列表?

    我正在尝试和修改this https bl ocks org mbostock 4339083d3 js 的示例 用于根据 JSON 树结构绘制树 这就是树的一部分开始时的样子 我正在尝试进行两个单独的修改 但我不知道该怎么做 当单击节点的
  • 为什么onClick下一个视频函数,使用YouTube JavaScript Player API,质量下降到默认?

    我在 CodeIgniter 上遇到了这个问题 使用 next video API 函数 单击按钮时新视频的质量比以前的低 所以基本上第一个视频始终处于我建议的质量 而下一个始终处于默认质量 On my template我有这个div di
  • 关闭弹出窗口后重新加载父页面

    我试图让用户通过弹出窗口登录 当他们单击弹出窗口的链接 这是一个 php 变量 时 他们可以登录 当窗口关闭时 我希望它重新加载他们最初所在的页面 父页面 这是signin php页面上的代码 但这所做的只是使登录页面成为用户所在的页面 我
  • 辅助功能:在密码输入中显示/隐藏密码按钮

    密码输入具有显示 隐藏按钮是很常见的 但我在网上发现很少有关于与其相关的可访问性问题的内容 我是否应该将任何类型的 ARIA 属性附加到按钮或密码输入 是一个复选框还是一个触发JS的按钮也能达到很好的效果 不知道我应该注意什么 作为一个不太
  • 如果使用 javascript 在 ASP.NET 中页面验证失败,如何禁用提交按钮

    如果页面上的验证失败 我需要使用 JavaScript 禁用表单上的保存按钮 如果没有 则必须使用以下代码启用它 Code
  • 如何使用 facebook 用户登录我的网站?

    我想知道 facebook 如何让用户登录我们的网站 我的意思是用户需要注册到我的网站才能发表评论 我如何通过我的 php 代码检查它是否是登录用户 我听说你只能用javascript检查它是否是登录用户 感谢您的任何解释 您可以使用脸书
  • CSS:结合纹理和颜色

    有人如何将用作背景图像的纹理和该纹理上方的背景颜色结合起来 这是纹理 我希望我的正文背景页面是这样的 我正在努力处理背景图像和背景颜色 http jsfiddle net 87K72 http jsfiddle net 87K72 body
  • 如何将函数绑定到DOM事件一次且仅一次,以便在事件触发时不会再次执行?

    所以我有以下形式的锚标签 a href link 我在页面加载时应用以下内容 我的意思是 文档准备就绪 jQuery a rel Tab click function e e preventDefault then I do some st
  • 打开我网站上的链接不起作用

    在我的网站上 我有一个我正在尝试获取工作的链接 我有一个遵循正常格式的链接 即 href 以 www youtube com 作为目标链接 并在末尾添加 target blank 当我单击该链接时 托管我的网站的网站会显示一条错误消息 当我
  • 删除已从另一个下拉菜单中选择的下拉值

    我在网上搜索了一段时间 但仍然找不到答案 我的网站上有三个下拉菜单 我使用它们来接受用户首选项 以便用户可以控制结果的输出 所以我想知道如果在其中一个下拉列表中选择了该值 是否可以从其他两个下拉列表中取出该值 例如 如果用户在第一个电影中选
  • 如何对数字进行排序? [复制]

    这个问题在这里已经有答案了 下面是代码 Is the sortNumber对数字进行排序的函数 a 和 b 是什么意思以及为什么存在 为什么sortNumber in n sort sortNumber 没有指定任何参数a and b Ja
  • 当页面加载图像时,它是只加载一次,还是每次在标记中找到它时加载?

    当页面加载图像时 它是只加载一次 还是每次在标记中找到它时加载 那么 jquery 呢 附加一个 img 会导致它再次重新加载吗 我问这个问题是因为我有高分辨率图像 但需要在标记的许多情况下使用它 img src hello jpg img

随机推荐