Javascript引用计数中的循环引用

Sah*_*and 12 javascript

在Nicholas Zakas的书中,他解释了在Javascript中使用引用计数进行垃圾收集时循环引用的问题.他使用以下示例:

function problem(){
    var objectA = new Object();
    var objectB = new Object();

    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
}
Run Code Online (Sandbox Code Playgroud)

解释说这两个对象永远不会释放分配给它们的内存,因为它们在函数内部有两个对它们的引用.我想澄清一下这是如何工作的.

显然,每个对象有两个引用.第一个对象既有objectAobjectB.anotherObject指向它.情况类似于第二个对象.所以每个对象的引用计数是2.但是当函数退出时会发生什么?书中没有真正描述过这一点.他说,只要对该值的引用被另一个值覆盖,引用计数就会递减.我认为这意味着:

function problem(){
    var objectA = new Object();
    var objectB = new Object();

    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
    objectA.someOtherObject = objectA; //<-- that if I were to do this, 
                                       //the reference count of the second object (B) 
                                       //would become 1, and 3 for the first object (A). 

}
Run Code Online (Sandbox Code Playgroud)

但是当函数退出时会发生什么?据我所知,两个objectAobjectB它们各自相互引用的属性都将被销毁,因此,两个对象的引用计数将减少2.我没有看到Zakas谈到的"循环引用问题" .有人可以解释他想说的话吗?

Ber*_*rgi 12

据我所知,objectA和objectB以及它们各自引用的属性都将被销毁.

号的局部变量 objectAobjectB将被销毁(因为该函数范围结束和没有封闭引用这些变量).这意味着变量引用的对象中的引用计数每个都减1.

如果对象的引用计数为0,则对象将被销毁,并且它引用的所有其他内容将使其计数减少.但是对象的数量仍然是1- 它们仍然相互引用 - 并且没有任何东西被破坏.


Poi*_*nty 10

当分配的对象包含对其他对象的引用时,引用计数和"循环"引用的"问题"出现,但是在活动分配中未引用.也就是说,在整个参考图中存在不活跃但仍然包含对其他非活动项的引用的项目.

在你的示例代码,当函数退出没有活跃的两个分配对象的引用,但引用的对象互相引用计数不为0的局部变量objectA,并objectB会在函数的出口消失(因为关闭在这一点上,它本身就是垃圾),但是对象持有的内部引用保持它们的引用计数大于零.

这不是一个无法解决的问题,但它使引用计数的简单方法变得复杂,成为垃圾收集技术.

请注意,没有规则或规范坚持JavaScript实现使用任何特定的垃圾收集技术.

  • *变量*`objectA`和`objectB`被销毁.将局部变量视为调用函数时创建的"阴影"对象的属性.当函数退出时,该对象没有对它的引用,因此它的属性就会消失.所有这些意味着局部变量引用*的对象*的引用计数减1. (2认同)
  • "有派系......" - 你的意思是"周期"吗?Cliques(完整的子图)确实表明了这个问题,但它们并不是必需的. (2认同)