在javascript中删除大blob

时间:2016-05-06 11:27:29

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

我在客户端创建了巨大的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,内存没有任何变化。

如何释放记忆?

1 个答案:

答案 0 :(得分:1)

我想你会在这里碰到一堵墙。 Javascript是garbage-collected,这意味着您可以做的最好的事情是&#34;未设置&#34;变量有效标记它们用于垃圾收集,浏览器认为它是时候。

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

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

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

window.location.reload();

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