C#垃圾收集

Jue*_*gen 4 c# heap garbage-collection

说我们有:

public void foo()
{
   someRefType test = new someRefType ();
   test = new someRefType ();
}
Run Code Online (Sandbox Code Playgroud)

垃圾收集器对第一个堆对象做了什么?是否在新任务之前立即收集垃圾?一般机制是什么?谢谢,Juergen

jas*_*son 14

垃圾收集器对第一个堆对象做了什么?

谁知道?这不是确定性的.想想看这样的:用无限的内存的系统上,垃圾收集器不具有任何事情.你可能认为这是一个糟糕的例子,但这就是垃圾收集器为你模拟的东西:一个拥有无限内存的系统.因为在具有比程序所需的更多可用内存的系统上,垃圾收集器永远不必运行.因此,您的程序无法对何时(如果有的话)收集内存做出任何假设.

所以,你的问题的答案是:我们不知道.

是否在新任务之前立即收集垃圾?

不,垃圾收集器不确定.你不知道什么时候收集和释放垃圾.您无法对何时收集垃圾或何时运行终结器做出任何假设.

实际上,收集它的速度非常快(这会使收集过于频繁).此外,在具有足够内存的系统上,垃圾收集器永远不必运行.

一般机制是什么?

这是一个相当广泛的问题.但基本原理非常简单:垃圾收集器模拟具有无限内存的机器.为此,它以某种方式跟踪内存,并能够确定内存何时是垃圾.当它认为合适时,由于需要模拟无限内存,它将不时收集这些垃圾并使其可用于再次分配.