Pat*_*ick 10 .net profiling garbage-collection
我正在使用内存分析器,dotTrace和perfmon计数器在C#应用程序中分析内存.我无法回答的一个问题是:垃圾收集在我的应用程序中导致的最大延迟是多少?我可以通过使用垃圾收集中的%time来获得此值的近似值,但有没有办法计算个别收集的时间?
看起来你问的是2个问题1- GC是否有最大延迟?2-如何为个人GC收集时间?
对于#1,GC吞吐量大约为200MB/sec /堆.这意味着GC能够在1秒内收集大小为100MB的堆.perheap概念是因为服务器GC,因为我们每个CPU创建1个堆.
所以,如果你有一个巨大的堆,你可以看到很大的延迟.请记住,当GC收集内存时,它会以短暂的方式执行此操作,因此与完整的GC集合相比,Gen0/Gen1集合非常便宜.
在.NET 4.0中,我们添加了一项功能,以最大限度地减少客户端应用程序的GC延迟,默认情况下,此功能在GC并发模式下启用.在此模式下,我们尝试在应用程序运行时在后台线程中收集堆.这为客户端应用程序带来了更好的暂停时间
对于#2:我们在.net框架中有一个非常强大的跟踪,称为ETW(它在Windows中可用,我们在CLR中利用它).ETW代表Windows事件跟踪(.当GC即将启动时,我们触发ETW事件,当GC完成时.使用这些ETW事件,您可以计算每个GC花费的时间.
有关更多信息,请参阅CLR ETW参考.此外,对于一个允许您处理ETW事件的良好托管库,请查看TraceEvent
希望这有帮助.谢谢