2011-10-01 171 views
3

说,我们有:C#垃圾收集

public void foo() 
{ 
    someRefType test = new someRefType(); 
    test = new someRefType(); 
} 

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

+5

你试过这个(http://www.google.com/search?q=how+c%23+garbage+collection+works)吗?真的,这将给你一个列表顶部的一堆高质量的解释。 –

回答

13

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

谁知道?这不是确定性的。想想这样吧:在一个有无限内存的系统上,垃圾收集器没有什么东西。你可能认为这是一个不好的例子,但这正是垃圾收集器为你模拟的:一个具有无限内存的系统。因为在系统中有足够多的可用内存而不是程序所需的内存,垃圾收集器从不需要运行。因此,您的程序无法对内存何时(如果曾经)进行收集的任何假设。

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

立即在新作业之前收集垃圾吗?

不。垃圾收集器不确定。你不知道什么时候会收集和释放垃圾。您不能对垃圾收集时间或终结器运行时间做出任何假设。

事实上,它收集得太快的可能性不大(这会使收集过于频繁)。此外,在具有足够内存的系统上,必须运行垃圾收集器永不

什么是一般机制?

这是一个相当广泛的问题。但基本原理非常简单:垃圾收集器模拟具有无限内存的机器。为此,它以某种方式记录内存,并能够确定内存何时是垃圾。当它看起来合适时,由于它需要模拟无限的内存,它会不时收集这些垃圾并将其重新分配。

+0

或者更确切地说,“我们无法知道”。 –

4

不,没有什么说这个对象被立即收集。事实上,这是不太可能的。它将最终由垃圾收集器收集,但您无法确切地知道何时。

您可以通过调用CG.Collect来强制收集,但通常不建议这样做。

垃圾收集的工作方式是一个相当大的主题,但有很好的文档,你可以read on MSDN

0

垃圾收集有许多不同的策略,多年来它们变得更加复杂和高效。在文献和网络上有很多关于它们的优秀资源。但是我也发现有时一个不完美和丰富多彩的比喻给了我一个直觉,帮助我开始。所以请允许我尝试:

。NET有一个所谓的“世代”垃圾回收器,我认为它的表现很像我自己。在几天的时间里,我让脏衣服和邮件(“C#对象”)堆积在我的客厅地板(“内存”)上,当我发现我再也看不到地毯时(“内存已满” )我花了一些时间清理(“垃圾收集”)客厅(“0代”),扔掉不再需要的物品(“不再可及”)并将其余物品移动到我的卧室( “第1代”)。通常这会给我带来一些时间,我不需要再做任何工作。但是当我的卧室填满时,我做了类似的事情,扔掉一些物体并将其他物体移动到我的地下室(“第二代”)。偶尔甚至地下室填满,然后我有我真正的问题,需要做一些重大的春季大扫除(“全面收集”)。

把这个隐喻应用到你的例子中,我们可能会猜测第一块垃圾(“堆对象”)只是坐在那里,直到我开始捡起它(“运行第0代收集器”),当我感觉就像它,当地板完全覆盖,或者可能永远不会:-)

0

要查看对象何时被删除,您可以覆盖类中的finalize方法以打印何时以及何时删除对象,如在下面的示例中:

class MyClass 
{ 
    private int _id; 

    public MyClass(int id) 
    { 
     _id = id; 
    } 

    ~MyClass() 
    { 
     Console.WriteLine("Object " + _id + " deleted at " + DateTime.Now + " ."); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass p1 = new MyClass(1); 
     p1 = new MyClass(2); 

     Console.ReadKey(); 
    } 
} 

要强制垃圾收集器更快地释放此对象,您可以dd一个字段作为一个长阵列,如private int []memory;和构造函数:memory=new int[10000000]