【问题标题】:Delete Javascript blobs?删除 Javascript blob?
【发布时间】:2014-04-06 20:06:50
【问题描述】:

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

具体来说,我在这样的块中使用 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 google-chrome-app


【解决方案1】:

这看起来像你有内存泄漏。

JavaScript 在您所说的意义上没有“删除”,它会在属性和变量成为孤立对象时进行垃圾收集。 delete 操作符是实现这一目标的一种方式 - 它从 Object 中删除属性的定义。
正确使用delete 意味着在属性上使用它,而不是variable。它适用于某些变量的原因是因为var 在全局命名空间中发生了什么(即它们成为window 的属性)。这也意味着你不能delete 一个参数。

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

接下来,考虑

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

o.b 现在是什么?

`o.b; // []`

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

那么这对你意味着什么?

要摆脱您的Blob,您需要销毁对它们的所有引用。

是的,撤销 URI 是其中的一部分,但您还需要在整个代码中一直删除引用。如果您觉得这很困难,我建议您将所有 Blobs 包装起来,这样至少可以将问题降到最低。

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 时立即使用new myBlob(blob),而不是使用常规的 Blob 创建,不保留对 blob 的其他引用。然后,当您完成Blob 后,调用myWrappedBlob.dispose();,它应该将其释放以进行GC。如果 真的 有必要将 Blob 直接传递给某个东西,我给它属性myBlob.blob

【讨论】:

  • 是的,你可能是对的。我保留了一个文件引用列表,可能我使用引用创建的每个 blob 仍然保存在那里。我会尽快处理完这些物品。
  • 作为跟进,看起来应用程序中从来没有泄漏,即使 blob-internals 已填满。我猜 Chrome 不会删除对文件系统 blob 的引用,但它们实际上并没有对工作内存做出贡献,因为它们显然一开始就不在内存中。
  • @PhilKulak 你在哪里读到 blob 不在内存中?我正在处理类似的问题。
  • @PabloJomer,不知道,对不起。在这一点上已经很久了,我几乎不记得这个项目了。 :D
猜你喜欢
  • 2016-09-01
  • 2019-11-28
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多