【问题标题】:Does holding a reference to an object property prevent the object from being garbage collected?持有对对象属性的引用会阻止对象被垃圾收集吗?
【发布时间】:2014-03-18 15:59:39
【问题描述】:

假设我有一个对象:

var o1 = {
    someKey: 'value'
};

以及引用第一个对象的另一个对象:

var o2 = {
    o1Ref: o1
};

还有第三个对象引用第一个对象的属性:

var o3 = {
    o1propRef: o1.someKey
};

然后,假设o2 被垃圾回收。 o3 上对o1.someKey 的引用是否会阻止收集o1

那么,同样,假设o1 更大,比如说:

var o1 = {
    someKey: 'value',
    someBigValue: Buffer(2000000)
};

o1 中未被引用的部分是否可以被收集,或者对象是否被作为一个整体收集?看来,o1 的第二个版本,o3 只是坚持o1.someKeyo1.someBigValue 可以释放。

另外,我确实意识到这可能因实现而异。如果是这样的话,一般来说,最好的方法是什么?

【问题讨论】:

    标签: javascript memory memory-management memory-leaks garbage-collection


    【解决方案1】:

    o3 上对 o1.someKey 的引用是否会阻止 o1 被收集?

    不,因为没有(参考)。在您创建对象时,您拥有o1.someKey 副本,而不是对o1.someKey 属性的引用。 (JavaScript 除了对象之外没有任何引用;所以没有属性引用,只有对象引用。)

    你可以看到你只是通过玩它来获得初始化时的值:

    var o1 = {
        someKey: 'value'
    };
    
    var o3 = {
        o1propRef: o1.someKey // (It's not a property reference, it's a copy of the value, but I left the name alone)
    };
    
    console.log(o3.o1propRef);  // "value"
    o1.someKey = "updated value";
    console.log(o3.o1propRef);  // "value"
    console.log(o1.someKey);    // "updated vale"
    

    对于o3 以防止o1 被垃圾收集,o3 必须引用o1(或引用它的东西)。仅仅从o1.someKey 获取值根本不会建立任何类型的引用关系。

    【讨论】:

    • 谢谢 T.J.——这就是我的怀疑。我一直想删除我对“引用”这个词的使用,因为我知道 JS 通过值传递事物,但我后来想,也许已经过时了,JS 实现使用“引用计数”?
    • 另外,刚刚去了你的个人资料(非常高的代表,哇)并注意到这个答案:stackoverflow.com/questions/4324133/…。会读!
    • @dimadima:你说得对,JavaScript 中的一切都是按值传递或赋值的。没有按引用传递或按引用分配。有一种值,称为对象引用,它引用对象。但它仍然是一个值。这就像索引到对象所在的大查找表中一样。实现是使用引用计数还是其他技术都无关紧要,因为您只是获得o1.someKey 的值,而不是对它的任何引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多