删除Javascript blob?
我在处理这些愚蠢的事情上花了不少时间。我有几个Chrome应用程序可以处理很多媒体文件;其中一个我能够使用一堆“delete”和一个删除Javascript blob?,javascript,google-chrome-app,Javascript,Google Chrome App,我在处理这些愚蠢的事情上花了不少时间。我有几个Chrome应用程序可以处理很多媒体文件;其中一个我能够使用一堆“delete”和一个window.URL.revokeObjectURL,最终阻止了它们在chrome://blob-internals/,但另一个,似乎没有任何帮助。我错过什么了吗?我完全知道我什么时候做完这该死的事情,但我似乎无能为力 具体地说,我在这样的块中使用文件对象: ref.file(function(f) { // Do some stuff... //
window.URL.revokeObjectURL
,最终阻止了它们在chrome://blob-internals/
,但另一个,似乎没有任何帮助。我错过什么了吗?我完全知道我什么时候做完这该死的事情,但我似乎无能为力
具体地说,我在这样的块中使用文件对象:ref.file(function(f) {
// Do some stuff...
// and now I'm done!
delete f
});
以下是我的应用程序的实际来源:
这是一个我认为我确实解决了问题的地方,但谁知道呢:
这看起来像是内存泄漏 JavaScript没有您所说的“删除”功能,它会随着属性和变量的孤立而进行垃圾收集。操作符是实现这一点的一种方法-它从对象中删除属性的定义。
正确使用
delete
意味着将其用于属性,而不是var
iable。它对某些变量起作用的原因是全局名称空间中的var
发生了什么(即它们成为window
的属性)。这也意味着您不能删除参数
此外,请注意,一旦函数完成调用,如果没有任何引用保持活动状态,那么它的所有内部将被GC调用
接下来,考虑
var o = {};
o.a = [];
o.b = o.a;
delete o.a;
现在什么是离岸价
`o.b; // []`
它仍然指向数组,即使我们删除了o.a
引用。这意味着数组不会被垃圾收集
这对你来说意味着什么
要清除blob,需要销毁对它们的所有引用
是的,撤销URI是其中的一部分,但是您还需要在整个代码中删除引用。如果你觉得这很困难,我建议你把所有的斑点都包起来,这样你至少可以把问题降到最低
var myBlob = (function () {
var key, o;
function myBlob(blob) {
var url;
this.blob = blob;
blob = null;
this.getURL = function () {
if (url) return url;
return url = URL.createObjectURL(this.blob);
};
this.dispose = function () {
if (url) url = URL.revokeObjectURL(url), undefined;
this.blob = null;
};
}
o = new Blob();
for (key in o)
(function (key) {
Object.defineProperty(myBlob.prototype, key, {
enumerable: true,
configurable: true,
get: function () {return this.blob[key];}
});
}(key));
o = key = undefined;
return myBlob;
}());
现在,在创建Blob时立即使用newmyblob(Blob)
,而不是常规的Blob创建,不保留对Blob的其他引用。然后在完成Blob后,调用myWrappedBlob.dispose()代码>并且它应该将其释放为GC'd。如果真的需要将Blob直接传递到某个对象中,我给它属性myBlob.Blob
是的,您可能是对的。我保留了一个文件引用列表,可能是我使用引用创建的每个blob仍然保存在那里。我会在处理完这些东西后尽快把它们处理掉。作为后续,看起来应用程序中从来没有出现过漏洞,尽管内部的水滴已经填满了。我猜Chrome不会删除对文件系统blob的引用,但它们实际上不会对工作内存产生影响,因为它们显然不在内存中。@PhilKulak你从哪里读到blob不在内存中的?“我正在处理类似的问题。”帕布罗约默,不知道,对不起。到现在已经很久了,我对这个项目几乎什么都不记得了D