谷歌浏览器应用程序 - 删除Javascript blobs

google chrome app - Delete Javascript blobs?

本文关键字:Javascript blobs 删除 应用程序 谷歌浏览器      更新时间:2023-09-26

我正在花很多时间摆脱这些愚蠢的东西。我有几个 Chrome 应用程序可以处理大量媒体文件;其中一个我能够使用一堆"删除"和一个最终阻止它们在chrome://blob-internals/中建立的window.URL.revokeObjectURL,但另一个似乎没有任何帮助。我错过了什么吗?我确切地知道我什么时候完成了该死的事情,但我似乎无能为力。

具体来说,我在这样的块中使用 File 对象:

ref.file(function(f) {
    // Do some stuff...
    // and now I'm done!
    delete f
});

这是我应用程序的实际来源:

https://github.com/pkulak/photo-importer

这是我认为我实际上解决了问题的地方,但谁真正知道:

https://github.com/pkulak/drive-slideshow

这看起来您有内存泄漏。

JavaScript 没有你所说的意义上的"删除",它会在属性和变量成为孤立时进行垃圾回收。delete运算符就是这样一种实现此目的的方法 - 它从对象中删除属性的定义。
正确使用delete意味着在属性上使用它,而不是在var上使用它。它适用于某些变量的原因是全局命名空间中的var会发生什么(即它们成为window的属性)。这也意味着您无法delete参数。

此外,请注意,一旦函数完成调用,如果没有引用保持活动状态,那么它的所有内部都将是GC'd。

接下来,考虑

var o = {};
o.a = [];
o.b = o.a;
delete o.a;

现在o.b是什么?

`o.b; // []`

即使我们删除了o.a引用,它仍然指向数组。这意味着数组不会被垃圾回收。

那么这对你意味着什么?

若要删除 Blob,需要销毁对它们的所有引用。

是的,撤销 URI 是其中的一部分,但您还需要在整个代码中删除引用。如果你觉得这很困难,我建议你包装所有的 Blob,这样你至少可以最大限度地减少问题。

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,而是在创建 Blob 时立即使用 new myBlob(blob),不保留对 Blob 的其他引用。然后,当你完成 Blob 时,调用myWrappedBlob.dispose();,它应该会释放它以成为 GC'd。如果确实有必要将 Blob 直接传递给某些东西,我给了它属性myBlob.blob