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



设置:

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

垃圾收集器是寻找这种类型的循环,还是泄漏?

一个现代的、好的垃圾收集器应该能够检测到这样的循环引用。相反,他们的垃圾收集能力不会受到此类参考的阻碍(他们是否积极寻找此类情况是另一回事)。

受此问题影响的朴素垃圾回收器的一个示例是,它只对引用进行计数,并且仅在引用计数变为零时才进行垃圾回收。但是,由于您上面指出的原因,这不是垃圾收集器通常的实现方式。

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

大多数 JavaScript 垃圾收集器都是标记和扫描垃圾收集器,它们在这种事情上做得很好。然而:

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

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

循环引用本身不会导致内存泄漏。这有点取决于您认为内存泄漏要包含的内容。目前,如果没有其他对象引用这些对象中的任何一个,那么它们将可用于 GC。但是,如果其他事物对一个有很强的引用,则两者都将保持活动状态。

内存泄漏的常见原因是您随后设置的位置

    obj.fun = null;

并期望这会导致乐趣被收集,忘记了乐趣与 obj 有关。这正是当您忘记解开事件时发生的情况。

最新更新