说,我们有:C#垃圾收集
public void foo()
{
someRefType test = new someRefType();
test = new someRefType();
}
是什么垃圾收集器做的第一个堆对象?是否在新任务之前立即收集垃圾?什么是一般机制?谢谢,Juergen
说,我们有:C#垃圾收集
public void foo()
{
someRefType test = new someRefType();
test = new someRefType();
}
是什么垃圾收集器做的第一个堆对象?是否在新任务之前立即收集垃圾?什么是一般机制?谢谢,Juergen
垃圾收集器对第一个堆对象做什么?
谁知道?这不是确定性的。想想这样吧:在一个有无限内存的系统上,垃圾收集器没有有做什么东西。你可能认为这是一个不好的例子,但这正是垃圾收集器为你模拟的:一个具有无限内存的系统。因为在系统中有足够多的可用内存而不是程序所需的内存,垃圾收集器从不需要运行。因此,您的程序无法对内存何时(如果曾经)进行收集的任何假设。
所以,你的问题的答案是:我们不知道。
立即在新作业之前收集垃圾吗?
不。垃圾收集器不确定。你不知道什么时候会收集和释放垃圾。您不能对垃圾收集时间或终结器运行时间做出任何假设。
事实上,它收集得太快的可能性不大(这会使收集过于频繁)。此外,在具有足够内存的系统上,必须运行垃圾收集器永不。
什么是一般机制?
这是一个相当广泛的问题。但基本原理非常简单:垃圾收集器模拟具有无限内存的机器。为此,它以某种方式记录内存,并能够确定内存何时是垃圾。当它看起来合适时,由于它需要模拟无限的内存,它会不时收集这些垃圾并将其重新分配。
或者更确切地说,“我们无法知道”。 –
不,没有什么说这个对象被立即收集。事实上,这是不太可能的。它将最终由垃圾收集器收集,但您无法确切地知道何时。
您可以通过调用CG.Collect
来强制收集,但通常不建议这样做。
垃圾收集的工作方式是一个相当大的主题,但有很好的文档,你可以read on MSDN。
垃圾收集有许多不同的策略,多年来它们变得更加复杂和高效。在文献和网络上有很多关于它们的优秀资源。但是我也发现有时一个不完美和丰富多彩的比喻给了我一个直觉,帮助我开始。所以请允许我尝试:
。NET有一个所谓的“世代”垃圾回收器,我认为它的表现很像我自己。在几天的时间里,我让脏衣服和邮件(“C#对象”)堆积在我的客厅地板(“内存”)上,当我发现我再也看不到地毯时(“内存已满” )我花了一些时间清理(“垃圾收集”)客厅(“0代”),扔掉不再需要的物品(“不再可及”)并将其余物品移动到我的卧室( “第1代”)。通常这会给我带来一些时间,我不需要再做任何工作。但是当我的卧室填满时,我做了类似的事情,扔掉一些物体并将其他物体移动到我的地下室(“第二代”)。偶尔甚至地下室填满,然后我有我真正的问题,需要做一些重大的春季大扫除(“全面收集”)。
把这个隐喻应用到你的例子中,我们可能会猜测第一块垃圾(“堆对象”)只是坐在那里,直到我开始捡起它(“运行第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]
。
你试过这个(http://www.google.com/search?q=how+c%23+garbage+collection+works)吗?真的,这将给你一个列表顶部的一堆高质量的解释。 –