我正在使用PerfMonitor.exe ( http://bcl.codeplex.com/wikipage?title=PerfMonitor )来追踪一个.NET 4.0应用程序的一些.NET性能问题,该应用程序使用了一些第三方库,其中一些是本机代码。
当我运行Perfmonitor GCTime报告时,它列出了各个GC,并以多种方式对它们进行了分类。报告中有一栏被称为“原因”。一些GC有Reason="Induced“,另一些GC有Reason="SmallAlloc”。
我假设标记为"SmallAlloc“的GC是由常规分配(New Object())引起的,而标记为"Induced”的GC是由调用"System.GC.Collect“引起的。如果你认为我做了错误的假设,请告诉我。
我试图找到调用System.GC.Collect的代码,但没有成功。使用MSVS2010Professional,我在System.GC.Collect中设置了一个断点,并通过编写一个包含对System.GC.Collect的调用的简单测试函数来确保此断点有效。然而,我正在调优的应用程序没有在那个断点处中断,这让我相信没有一个代码调用System.GC.Collect。
我在想,也许有本机代码通过直接调用mscorwks.dll中的本机函数并绕过System.GC.Collect来诱导GC。我看到System.GC.Collect在JitHelpers.cpp中调用_Collect,这是在mscorwks中。有没有办法在该函数中设置断点?
发布于 2011-05-24 20:41:47
我仔细查看了PerfMonitor.exe的输出。我不确定每个标记为“诱导”的GC实际上都是由System.GC.Collect诱导的。似乎所有第1代GC都被标记为Reason=“诱导”,而所有第0代GC都被标记为Reason="SmallAlloc“。Gen2 GC被标记为Reason="LowMemory“。
有一个性能计数器用于跟踪.NET诱导的GC。我监视了那个性能计数器,它没有显示我的进程中的任何诱导GC。所以我得出结论,Perfmonitor.exe误导了我。
发布于 2011-05-27 04:09:30
似乎你已经推断出GC.Collect()在这里不是你的问题,但作为参考,我过去成功地在GC.Collect中设置了断点,当时我可以从诱导GC计数器中看到确实发生了诱导GC。
您可以将断点位置设置为System.GC.Collect并尝试它。使用这种策略,我有时成功地设置了框架断点,有时却不成功。我不知道是因为方法/属性调用被优化了,还是其他原因。但它总是值得一试。您可能需要在Tools->Options->Debug部分中禁用"Just My Code“。
https://stackoverflow.com/questions/6104741
复制相似问题