.net垃圾收集器什么时候运行?

时间:2010-06-21 21:52:27

标签: .net debugging garbage-collection

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

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

哦,我想到的资源是来自Sql连接池的连接,而不是内存: - )

6 个答案:

答案 0 :(得分:9)

一般来说,您不应该担心或考虑GC的运行时间。

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

如果您希望对GC进行更精细的控制(除非在特定情况下我不建议这样做),您可以使用GC.AddMemoryPressureGC.RemoveMemoryPressure。这些不会强制GC运行,而是提示它除了CLR分配的托管内存之外还有其他内存正在运行。这可能会导致它更频繁地运行,如果您在本机代码中分配大块内存,这将非常有用。

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

答案 1 :(得分:5)

您必须使用.NET 4.0,在预告片版本中不支持您要求的内容。

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

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

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

答案 2 :(得分:3)

垃圾收集不会释放您的池数据库连接。关闭/释放连接对象时,连接将返回到池中。连接池本身在需要打开更多连接时进行管理,并根据您在连接字符串中访问池的次数和池的配置再次关闭它们。除了回收分配给SqlConnection实例的内存之外,垃圾收集与此无关。你正在吵着错误的树,询问垃圾收集和得到(并接受)与你所追求的无关的答案(如果我理解你的问题)。

答案 3 :(得分:2)

无论什么时候感觉

.NET垃圾收集器是generational garbage collector。肯定有一种疯狂的方法,但这并不是你能准确预测的东西。

答案 4 :(得分:1)

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

严肃地说,.Net被设置为优化GC。它可能发生在方法调用结束时,或者可能运行一天而不需要进行GC。是否有特定原因需要知道何时收集?

答案 5 :(得分:0)

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