在这种情况下,垃圾回收器将做什么
本文关键字:什么 这种情况下 | 更新日期: 2023-09-27 18:23:42
我试图了解GC将如何操作的两种情况
1-有两个对象-对象1和对象2对象1对对象2有引用,对象2对对象1有引用现在,这两个对象都没有使用,GC可以收集它们。
会发生什么?GC跳过这个集合吗?
2-同样的问题,但我们有4个(或n个)对象相互引用。GC将如何处理此案???
与COM不同,公共语言运行库不使用引用计数来控制对象生存期。相反,垃圾收集器跟踪对象引用,并标识运行代码无法再访问的对象。
这大大简化了组件编程,因为您不必担心循环引用如果一组对象包含对彼此的引用,但这些对象都不是从堆栈或共享变量直接或间接引用的,则垃圾回收将自动回收内存。
http://msdn.microsoft.com/en-us/library/0t81zye4(v=vs.71).aspx
.NET使用的GC是一个跟踪垃圾收集器("标记和扫描"是一个相关术语)
如果程序内存的非垃圾部分的指针/引用无法再访问内存对象,则将其视为"垃圾"。
为了确定什么是可达的,什么是不可达的,GC首先建立一组根引用/指针。这些都是保证可以访问的引用。示例包括局部变量和静态字段。
然后,它递归地跟踪这些引用,并将遇到的每个对象标记为"非垃圾"。一旦它用完了要遵循的引用,它就会进入"清除"阶段,在这个阶段,所有未标记为"非垃圾"的对象都会被释放(这可能包括调用对象的终结器)。
因此,一旦"对象环"中的任何对象都没有被"活动"对象的任何部分引用,它就会被垃圾收集。
AFAIK,GC将只收集不再有任何引用的对象。因此,只要某个对象有对它的引用,它就不会被收集。
如果对象存在的时间足够长,它们将进入收集周期的下一阶段。
我不确定,但您可以尝试创建大量对象(4个线程,填充列表),然后取消列表。如果ram宕机,它知道不再有对被引用对象块的引用,如果没有,它就不会:)
CLR垃圾收集方法论是否意味着它';抛出循环对象引用是安全的吗。NET的GC不是引用计数器,它遍历所有分配的对象,并尝试将它们链接到GC根对象。它可以处理和处置这些循环引用,无论它们有多少。