首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.NET 4.0诱发胃癌溯源

.NET 4.0诱发胃癌溯源
EN

Stack Overflow用户
提问于 2011-05-24 09:02:45
回答 2查看 1.5K关注 0票数 3

我正在使用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中。有没有办法在该函数中设置断点?

EN

回答 2

Stack Overflow用户

发布于 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误导了我。

票数 0
EN

Stack Overflow用户

发布于 2011-05-27 04:09:30

似乎你已经推断出GC.Collect()在这里不是你的问题,但作为参考,我过去成功地在GC.Collect中设置了断点,当时我可以从诱导GC计数器中看到确实发生了诱导GC。

您可以将断点位置设置为System.GC.Collect并尝试它。使用这种策略,我有时成功地设置了框架断点,有时却不成功。我不知道是因为方法/属性调用被优化了,还是其他原因。但它总是值得一试。您可能需要在Tools->Options->Debug部分中禁用"Just My Code“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6104741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档