如何检测对象是否已在Javascript中进行垃圾回收?

时间:2015-02-17 15:12:51

标签: javascript garbage-collection

我正在构建一个使用var:

创建'level'对象的javascript游戏
function start() {
   var myGameLevel = new Level(2);
}

这个“Level()”对象具有很多功能,主要是向DOM添加元素并使它们具有交互性。简化:

function Level(i) {
    var _difficulty = i;

    this.init = function(){
         jQuery("#container").append(...game elements here...);
         jQuery("#button").on('click', function() {...});
    }
}

我的问题:如何知道在'start'函数中创建的Level对象是否已被垃圾回收?我的目标是只使用“var”变量,以便没有外部引用。当DOM被清除所有游戏元素时,我预计“级别”对象将从内存中释放,但我怎么能确定?

3 个答案:

答案 0 :(得分:5)

弱引用are considered a security risk,因此无法在浏览器中使用非特权代码。

这些问题并不适用于特权代码或服务器端javascript执行,例如通过node.js,因此可以使用特定于平台的弱参考实现。
例如firefox插件可以使用Components.utils.getWeakReference()

对于某些编程模式WeakMap / WeakSet可能就足够了,但它们不允许程序观察垃圾收集,因为这样做需要一个密钥来探测这些数据结构,但是在该密钥上可以防止首先收集对象。

JS实现者提出的另一个问题是,取决于假设的弱参考API的强大程度 - 例如提供最终通知 - 它可能会暴露大量的GC行为,这反过来可能会限制未来的实施,因为改变行为可能会破坏Web应用程序。


更新:现在is a proposal标准化JS中的弱引用,通过将弱可达对象的释放绑定到JS事件循环来减轻感知风险,使行为更具确定性。

答案 1 :(得分:3)

我认为你无法控制JavaScript垃圾收集。 通常,如果没有对它的引用,则可以收集变量或对象。因此,您可以通过设计逻辑来增加获取对象的机会,从而使对象超出范围。

答案 2 :(得分:2)

通常在 javascript 垃圾收集中是不确定的。您无法知道对象是否或何时被垃圾收集。这适用于强引用的对象。

在 ES12 及之后,您可以使用 Finalizers

Finalizers 可让您在对象被垃圾回收时使用 javascript 回调。限制仍然是,何时执行回调是不确定的。可能需要一分钟或一小时。

// object creation
let abc = new Array(200).fill(true);

const cleanup = new FinalizationRegistry(key => {
  // your code here
});

// tagging variable abc to finalizer
cleanup.register(abc, 'werwer');

// abc = null;