我正在使用内存探查器,dotTrace和perfmon计数器在C#应用程序中对内存进行性能分析。我一直无法回答的一个问题是:垃圾回收在我的应用程序中导致的最大延迟是多少?我可以通过使用垃圾回收中的%时间来获得一个近似值,但是有什么方法可以对单个回收进行计时?

最佳答案

看来您在问2个问题
1- GC是否有最大延迟?
2-如何计时单个GC收集?

对于#1,GC吞吐量大约为200MB/秒/堆。这意味着GC能够在1秒内收集大小为100MB的堆。 perheap的概念是因为服务器GC,因为我们每个CPU创建1个堆。

因此,如果堆很大,则可以看到很大的延迟。
请记住,当GC收集内存时,它以短暂的方式执行此操作,因此与完整的GC收集相比,Gen0/Gen1收集非常便宜。

在.NET 4.0中,我们添加了一项功能,以最大程度地减少客户端应用程序的GC延迟,该功能默认情况下在GC并发模式下启用。在这种模式下,我们尝试在应用程序运行时在后台线程中收集堆。这样可以为客户端应用程序提供更好的暂停时间

对于#2:.net框架中有一个非常强大的跟踪功能,称为ETW(在Windows中可用,在CLR中利用它)。 ETW代表Event Tracing For Windows (。当GC即将开始或GC完成时,我们会触发ETW事件。使用这些ETW事件,您可以计算出每个GC所花费的时间。

有关更多信息,您可以引用CLR ETW reference。另外,对于一个不错的托管库,它允许您处理ETW事件,请查看TraceEvent

希望对您有所帮助。
谢谢

10-08 17:15