垃圾收集的根源是什么?

我把root的定义理解为"程序可以访问的任何引用",live的定义是正在使用的对象,可以是局部变量,也可以是静态变量.

区分根对象和活对象之间的区别让我有点困惑.

什么是通往根的道路?根对象和活动对象是如何工作的?

有人能详细说明一下吗?

推荐答案

如果把内存中的对象看作一棵树,"根"就是根 node ——程序可以立即访问的每个对象.

Person p = new Person();
p.car = new Car(RED);
p.car.engine = new Engine();
p.car.horn = new AnnoyingHorn();

有四个对象;一个人,一辆红色的汽车,它的引擎和喇叭.绘制参考图:

     Person [p]
        |
     Car (red)
   /           \
Engine    AnnoyingHorn

最后你会在树的"根"处得到Person.它是活动的,因为它被一个局部变量p引用,程序可以随时使用它来引用Person对象.这也适用于其他对象,通过p.carp.car.engine等.

由于Person和所有其他递归连接到它的对象都是活动的,如果GC收集它们将会有麻烦.

但是,如果在一段时间后运行以下命令,请考虑一下:

p.car = new Car(BLUE);

然后重新绘制图表:

     Person [p]
        |
     Car (blue)       Car (red)
                    /           \
                Engine    AnnoyingHorn

现在,Person可以通过p访问,蓝色汽车可以通过p.car访问,但红色汽车或其部件再也不能访问了-它们没有连接到活动的根.它们可以安全地收集起来.

因此,这实际上是一个从每个起点(每个局部变量、全局变量、静态变量、其他线程和堆栈框架中的所有内容)到每个根的问题,并递归地跟踪所有引用,以形成所有"活动"对象的列表:正在使用且不适合删除的对象.其他一切都是垃圾,等待收集.

.net相关问答推荐

Long.MaxValue从Single到Long的转换导致溢出异常

NETSDK1083:无法识别指定的 RuntimeIdentifierwin10-x64

EFCore.DbSet.Update 方法添加新行而不是更新它

IANA 到 Windows 时区映射

我应该创建一个 DateRange 对象吗?

C#6.0 字符串插值本地化

重新启动(回收)应用程序池

XmlNode 值与内部文本

简单委托(委托)与多播委托

在 Moq Callback() 调用中设置变量值

是否有 TLS 1.2 的 .NET 实现?

在 ToString() 之前判断 null

.NET 反射的成本是多少?

WCF反序列化如何在不调用构造函数的情况下实例化对象?

在 .NET (C#) 中本地存储数据的最佳方式

当程序员说针对接口而不是对象的代码时,他们是什么意思?

Environment.GetFolderPath(...CommonApplicationData) 在 Vista 上仍然返回C:\Documents and Settings\

确定使用 ContextMenuStrip 的控件

C# List<> 按 x 然后 y 排序

C# 应用程序中的资源和嵌入式资源有什么区别?