c# - .net CLR相关问题

标签 c# .net clr

这是一个与.net CLR相关的问题。

我有3个对象A,B,C

A引用B,B引用c

如果我明确地杀死对象“ A”,堆中的这些对象会发生什么。将对哪些对象进行垃圾回收?(对象A或B或c或全部?)

有人可以详细解释这种情况下的垃圾收集过程。

提前致谢
国民账户体系

最佳答案

首先-您不能“明确杀死对象“ A””;您可以清除对其的引用,但这只是将局部变量设置为null,并且与托管堆上的实际对象无关。您可以Dispose(),但与GC无关。

一切取决于;还能看到B / C吗?如果没有,则有资格领取。但是GC是不确定的。它只会在选择时发生。在某个不确定的时间,GC将启动,检测到这些对象不可达,然后将其删除。在此过程中,它将检查所有具有终结器(仍未完成)的对象,并执行终结器(分两步进行)。

人们经常在可及性方面忘记的一件事是事件。如果B / C订阅一个长期对象上的事件,则B / C是可到达的(由事件发布者访问)。



澄清; GC通过从根对象(线程等)构建树来工作。它遍历每个引用,标记所有可以到达的对象。末尾未标记的任何内容都可以收集。这样可以避免由于数据孤岛断开而导致内存泄漏的COM / COM +问题,其中X => Y和Y => X(因此X和Y都具有正的引用计数,因此都不会清除)。

关于c# - .net CLR相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1656692/

相关文章:

javascript - 如果单击单选按钮,如何使不可见的文本框可见?

c# - 派生方法比 C# 中的覆盖更强大?

c# - 为什么 System.Guid 不实现 System.IConvertible?

c# - 是什么导致这个 HTTPS WebRequest 即使在浏览器中工作也会超时?

c# - 在 .net 中创建不可变类型时,拥有公共(public)字段是否有效?

.net - 从 .NET 应用程序执行 shell 命令

c# - 为什么 Thread.Join 不允许通过 COM 消息?

c# - 如何将 bool 值转换为本地化字符串

c# - WPF、C#、MVVM 在模型中静态变量的变化中动态通知 ViewModel

c# - 抑制 xsi :nil but still show Empty Element when Serializing in . 网络