设置:
obj = object
obj.fun = function
obj.fun.ob = reference to obj
垃圾收集器是否在寻找这种类型的循环,或者这是否是泄漏?
答案 0 :(得分:2)
一个现代的,好的垃圾收集器应该能够检测那些循环引用。相反,他们的垃圾收集能力并没有受到这些引用的阻碍(无论他们是否积极寻找这种情况都是一个不同的故事)。
受此问题影响的天真垃圾收集器的一个示例是,仅当引用计数变为零时,才会简单地计算引用和垃圾收集。但是,由于您上面指出的原因,这不是垃圾收集器通常的实现方式。
有许多更好的垃圾收集算法,并且本身就是一个很大的主题。
答案 1 :(得分:2)
大多数JavaScript垃圾收集器都是标记和清除垃圾收集器,它们可以很好地处理这类事情。但是:
在IE6和之前的版本中,如果obj
是COM对象且obj.fun
是JavaScript函数,则可能是内存泄漏。 IE6和之前的版本使用COM垃圾收集器(它是一个引用计数器)用于COM对象和JavaScript垃圾收集器(它是标记和扫描收集器),用于JavaScript对象。
在IE7中,它仍然是内存泄漏,但是在卸载页面时会收集它。但是在页面启动时它仍然可能泄漏。
答案 2 :(得分:1)
循环引用本身不会导致内存泄漏。这取决于你认为包含的内存泄漏。目前,如果没有其他任何参考这些对象,那么它们将可用于GC。但是,如果其他东西有强烈的引用,那么两者都会保持活力。
内存泄漏的常见原因是您可以设置
obj.fun = null;
并期望这将带来收集的乐趣,忘记了乐趣有obj的参考。这正是忘记解开事件时发生的事情。