当我调试.net代码时,我怎么知道垃圾收集器何时运行?
我不希望控制垃圾收集器何时运行。我只希望能够知道它何时运行。我有一些资源耗尽的代码。我知道资源没有被使用;我想知道GC何时运行以释放它们。
哦,我想到的资源是来自Sql连接池的连接,而不是内存: - )
答案 0 :(得分:9)
一般来说,您不应该担心或考虑GC的运行时间。
垃圾收集器将在运行时选择的不确定时间根据需要运行。
如果您希望对GC进行更精细的控制(除非在特定情况下我不建议这样做),您可以使用GC.AddMemoryPressure和GC.RemoveMemoryPressure。这些不会强制GC运行,而是提示它除了CLR分配的托管内存之外还有其他内存正在运行。这可能会导致它更频繁地运行,如果您在本机代码中分配大块内存,这将非常有用。
没有直接API来跟踪GC运行。 (例如,GC类不包含任何通知垃圾收集发生的事件。)唯一直接了解GC执行时的方法是使用profiling API。
答案 1 :(得分:5)
您必须使用.NET 4.0,在预告片版本中不支持您要求的内容。
基本上,你在循环中调用WaitForFullGCApproach和WaitForFullGCComplete方法。 WaitForFullGCApproach将阻塞,直到您看到GC,WaitForFullGCComplete将阻塞,直到GC完成。
请仔细阅读本文。如果您使用此方法,那么您有责任确保垃圾收集实际发生。如果搞砸了,你可能会破坏GC并快速耗尽内存。
答案 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