如何知道两个检查点之间是否触发了gen完全垃圾收集?

时间:2014-02-07 16:27:28

标签: c# garbage-collection

我正在分析关键代码段的时间花费。

//Take a timestamp before
var before = DateTime.UtcNow;

DoCriticalMethod();

//Take a timestamp after
var after = DateTime.UtcNow;

有时我的某些价值明显高于其他价值。

我怀疑它是垃圾收集,所以我想将高值与在此过程中发生垃圾收集的事实相关联。

到目前为止我试过这个: 我之前拿走了柜台:

//Take the number before
int gc2CountBefore = GC.CollectionCount(2);

...

//Take the number after
bool hasgc2occured = (GC.CollectionCount(2) - gc2CountBefore) != 0;

我是否以良好的方式做到了?

3 个答案:

答案 0 :(得分:5)

“RegisterForFullGCNotification”方法注册在运行时检测到完整垃圾收集正在接近时引发的通知。此通知分为两部分:完全垃圾收集即将到来以及完整垃圾收集完成时。

要确定何时引发通知,请使用“WaitForFullGCApproach”和“WaitForFullGCComplete”方法。通常,您在while循环中使用这些方法来不断获取显示通知状态的“GCNotificationStatus”枚举。

“WaitForFullGCApproach”和“WaitForFullGCComplete”方法旨在协同工作。使用一个没有另一个可以产生不确定的结果。

答案 1 :(得分:2)

您可以阻止您的应用程序在某个部分进行垃圾收集:

Prevent .NET Garbage collection for short period of time

我会尝试,然后反复分析您的代码。如果你没有看到太大的波动,可能是GC导致它。

答案 2 :(得分:1)

还有一些关于垃圾收集器监视器的StackOverFlow问题:

Monitoring Garbage Collector in C#

底线是启动一个单独的线程并注册到GC事件:

GC.RegisterForFullGCNotification(int,int)

然后您可以等待任何GC活动:

GCNotificationStatus s = GC.WaitForFullGCApproach(10000);

如果有某些活动,您应该收到通知!