Cal*_*bis 5 javascript memory internet-explorer 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"
});
Run Code Online (Sandbox Code Playgroud)
这会占用大量内存.当我完成blob时,我想释放那段记忆. (我在IE11 Edge中测试了这个)
两次运行此脚本将失败,因为无法分配更多内存
我已经尝试过设置blob = null或使用delete blob,内存没有任何反应.
如何释放记忆?
我认为你会在这里碰壁。Javascript 是垃圾收集的,这意味着你能做的最好的事情就是“取消设置”变量,以便在浏览器认为是时候有效地将它们标记为垃圾收集。
看起来很迷人,设置为null不会立即释放分配的内存,而只会删除引用——只有在垃圾收集实际发生时才可能稍后释放内存(假设不存在对所涉及对象的其他引用):
var blobA = new Blob(...);
var blobB = blobA;
blobA = null;
console.log(blobB); // Blob, the object still exists
Run Code Online (Sandbox Code Playgroud)
垃圾收集是自动的,并且无法在Javascript 中预测或检测垃圾收集何时发生。但是,有一种方法可以手动触发它:
window.location.reload();
Run Code Online (Sandbox Code Playgroud)
这是正确的,完全重新加载整个页面将触发垃圾收集,据我所知,这实际上是唯一的方法。在设计应用程序时您可能需要考虑这一点。