2010-06-21 75 views
12

当我调试.NET代码时,如何知道垃圾收集器何时运行?.net垃圾回收器何时运行?

我不想控制垃圾收集器运行的时间。我只希望能够知道它何时运行。我有一些代码耗尽资源。我知道这些资源没有被使用;我想知道GC何时运行以释放它们。

哦,我心目中的资源是从SQL连接池,而不是内存连接:-)

+1

为什么你需要知道它何时运行? – 2010-06-21 21:53:42

+0

垃圾回收器只收集(按定义)垃圾,即不再由程序引用的对象。 – Ken 2010-06-21 21:58:03

+8

问这个问题就像问下一个暴民老板,当他的下一批药物预计到达。答案是'没有你的怪事',紧跟着一个公司:: smack ::头到后面:) – 2010-06-21 22:10:37

回答

5

你必须使用.NET 4.0,你所要求的是在收费版本中不支持。

基本上,您在循环中调用WaitForFullGCApproach和WaitForFullGCComplete方法。 WaitForFullGCApproach将会阻塞,直到您看到一个GC,WaitForFullGCComplete将会阻塞,直到GC完成。

请仔细阅读本文。如果你使用这种方法,那么你有责任确保实际发生的垃圾收集。如果你搞砸了,你可能会破坏GC并快速耗尽内存。

http://msdn.microsoft.com/en-us/library/cc713687.aspx

9

你不应该,在一般情况下,有没有担心或思考的GC运行时。

垃圾收集器将根据需要在运行时选择的不确定时间运行。

如果您希望对GC进行更精细的颗粒控制(除特殊情况外我不推荐),您可以使用GC.AddMemoryPressureGC.RemoveMemoryPressure。这些不会强制GC运行,而是暗示存在其他内存,而不是CLR分配的托管内存。这可能会导致它更频繁地运行,如果您在本机代码中分配大块内存,这会非常有用。

没有直接跟踪GC运行的API。 (例如,GC类不包含任何通知垃圾收集发生的事件)。唯一直接了解GC执行时的方法是使用profiling API

+0

我发现了一些文档,它指出.net记录内存并基于此优化GC运行。这是否意味着如果我需要GC运行以释放与SQL服务器的连接,我就会感冒了? – 2010-06-21 22:44:46

+0

@新星:不.SQL连接是一个与内存不同的问题。您可以通过conn.Close()手动关闭它:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx – 2010-06-21 22:59:22

+0

Hrm ...为什么在这里downvoting? – 2010-06-22 01:11:17

1

在.NET框架中,GarbageCollector运行你。

毫无疑问,.Net被设置为优化GC。它可能发生在方法调用结束时,或者可能运行一天而不需要GC'd。是否有一个特定的原因需要知道什么时候收集?

2

每当它感觉就像是

的.NET垃圾收集器是generational garbage collector。这绝对是一种疯狂的方法,但它不完全是你可以准确预测的东西。

3

没有垃圾收集释放池化的数据库连接。当您关闭/处理连接对象时,连接将返回到池中。连接池本身会管理何时需要打开更多连接并根据连接字符串中连接池的配置和连接池的配置再次关闭它们。除了回收分配给SqlConnection实例的内存之外,垃圾收集与此无关。在询问垃圾收集和获取(并接受)与您之后的内容没有任何关系的答案时(如果我正确理解您的问题),您正在吠叫错误的树。

0

GC运行的两个重要原因是a)如果第0代满了b)当堆满时。礼貌 - CLR Via C#,Jeffrey Richter