这是一个与.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/