【问题标题】:Will be an object garbage collected if there is a reference to it from another object? [duplicate]如果有另一个对象对它的引用,是否会被垃圾回收? [复制]
【发布时间】:2016-05-17 16:08:49
【问题描述】:

It is not a duplicate,我想在 C# 的上下文中了解这一点。

我有这样的课程:

public class A
{
    public List<string> AList { get; set; }
}

public class B
{
    public List<string> BList { get; set; }
}

想象一下,在row 6 发生垃圾收集:

1 row: A objectA = new A();
2 row: B objectB = new B();

3 row: objectA.AList = new List<string>() { "1", "2", "3" };
4 row: objectB.BList = objectA.AList;

5 row: objectA = null;
6 row: //Garbage collection occurs

我有两个问题:

  1. 会被objectA 垃圾回收吗?如果是,为什么?原因,在我看来,这些对象将在如下图所示的堆中创建

  2. 我的第二个问题是下图关于如何在堆中分配对象是否正确。我的意思是,objectA.AList 是放在一个圆圈内(上图)还是靠近圆圈(下图)

【问题讨论】:

  • 所以我不确定这个答案,所以希望有更好理解的人能够回答,但据我了解,没有任何引用它们的对象最终应该 被垃圾收集,不需要其他任何东西。一个对象最终需要活动范围(在引用链上)到当前正在执行的程序,以便不被垃圾收集。一旦它消失了,无论何时运行,这对收集器来说都是公平的游戏。
  • 这需要 2 分钟来检查。但是逻辑在我的脑海中决定,是的,因为 objectB.Alist 包含对 Alist 的引用,所以如果 Alist 被更改,那么 objectB.Alist 的结果也是 Alist。因此,如果 Alist 等于 null,objectB.Alist 也是如此。所以 Alist 的内容是 GC 的。但是对象 Alist 不是,它现在是 null
  • @HenkHolterman 请看我的独特问题stackoverflow.com/questions/37293387/…

标签: c# garbage-collection


【解决方案1】:

是的,objectA 引用的变量将被 - 或至少 可能 被垃圾回收。 没有提及它了。 (不能保证它会“很快”被收集,但它有资格进行垃圾收集。)

objectA.AList 引用的列表不会被垃圾回收,因为 objectB.BList 现在引用它。

您的第一个图表的问题是一个对象在另一个“内部”的想法。这不是它的工作原理——一个对象只是维护一个对另一个对象的引用,但每个对象实际上都是一块独立的内存......如果没有任何东西对特定对象的引用,它是合格的用于垃圾收集。

【讨论】:

  • 感谢您的回答!如果我在objectA 中创建新字段(不是财产)int k,那么k 将被放置在堆中的某个位置,而不是在objectA 中,我对吗?
  • @StepUp: 不,k 将成为 objectA 的一部分,就像支持 AList 的字段一样 - 但支持 @987654332 的字段的 @ 只是一个引用,它不是列表对象。可能值得您阅读stackoverflow.com/questions/32010172/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多