我知道这是一个参考周期。但它是内存泄漏吗?

时间:2012-07-08 21:33:01

标签: javascript memory-leaks cycle

设置:

obj = object
obj.fun = function
obj.fun.ob = reference to obj

垃圾收集器是否在寻找这种类型的循环,或者这是否是泄漏?

3 个答案:

答案 0 :(得分:2)

一个现代的,好的垃圾收集器应该能够检测那些循环引用。相反,他们的垃圾收集能力并没有受到这些引用的阻碍(无论他们是否积极寻找这种情况都是一个不同的故事)。

受此问题影响的天真垃圾收集器的一个示例是,仅当引用计数变为零时,才会简单地计算引用和垃圾收集。但是,由于您上面指出的原因,这不是垃圾收集器通常的实现方式。

有许多更好的垃圾收集算法,并且本身就是一个很大的主题。

答案 1 :(得分:2)

大多数JavaScript垃圾收集器都是标记和清除垃圾收集器,它们可以很好地处理这类事情。但是:

在IE6和之前的版本中,如果obj是COM对象且obj.fun是JavaScript函数,则可能是内存泄漏。 IE6和之前的版本使用COM垃圾收集器(它是一个引用计数器)用于COM对象和JavaScript垃圾收集器(它是标记和扫描收集器),用于JavaScript对象。

在IE7中,它仍然是内存泄漏,但是在卸载页面时会收集它。但是在页面启动时它仍然可能泄漏。

答案 2 :(得分:1)

循环引用本身不会导致内存泄漏。这取决于你认为包含的内存泄漏。目前,如果没有其他任何参考这些对象,那么它们将可用于GC。但是,如果其他东西有强烈的引用,那么两者都会保持活力。

内存泄漏的常见原因是您可以设置

    obj.fun = null;

并期望这将带来收集的乐趣,忘记了乐趣有obj的参考。这正是忘记解开事件时发生的事情。