【问题标题】:Deleting big blobs in javascript在javascript中删除大blob
【发布时间】:2016-09-01 11:01:36
【问题描述】:

我在客户端中创建了巨大的 blob,用户可以将其下载为文件。

下面的例子只是为了演示这个问题

var x= "sdfslkdfjklsdjiflskdflsdf" ; for(var i = 0; i<19;i++) x=x+x
var blob = new Blob([x,x,x,x,x,x,x,x,x,x,x,x,x], {
    type : "text/plain"
});

这会占用大量内存。当我完成 blob 后,我想释放该内存。 (我正在 IE11 Edge 中测试这个)

运行此脚本两次将失败,因为无法分配更多内存

我已经尝试设置blob = null或使用delete blob,内存没有任何反应。

如何释放内存?

【问题讨论】:

  • 你可以试试“delete blob;”
  • 所有答案都是正确的。 Javascript 是垃圾收集的,所以这些是你最好的选择。如果您想更好地控制内存,请切换到服务器端实现并使用非托管代码。不过,要为各种地狱做好准备。
  • 如果您曾经使用过URL.createObjectURL() 方法,请记住在您不再需要对象url 时也调用URL.revokeObjectURL(),否则这将发生在您的记忆中,并且不会被GCed。
  • @Kaiido 即使您只将代码粘贴到控制台中,问题仍然存在
  • @Kaiido 我尝试运行脚本然后硬刷新(ctrl+F5),内存仍然被分配。唯一有效的方法是关闭 IE。 (提醒一下我实际上正在运行 IE11 Edge)

标签: javascript internet-explorer memory internet-explorer-11


【解决方案1】:

我想你会在这里碰壁。 Javascript 是garbage-collected,这意味着您能做的最好的事情就是“取消设置”变量以有效地将它们标记为垃圾回收,浏览器认为是时候了。

尽管看起来很迷人,但设置为 null 不会立即释放分配的内存,而只会删除一个引用——只有在垃圾收集实际发生时才可能稍后释放内存(假设没有其他引用涉及的对象存在):

var blobA = new Blob(...);
var blobB = blobA;
blobA = null;
console.log(blobB); // Blob, the object still exists

垃圾收集是自动的,没有方法可以预测或检测它何时发生在 Javascript 中。但是,有一种方法可以手动触发它:

window.location.reload();

没错,完全重新加载整个页面会触发垃圾收集,这实际上是 AFAIK 的唯一方法。在设计应用程序时,您可能需要考虑这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2011-10-08
    • 2020-05-25
    • 2020-12-16
    • 2015-05-30
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多