微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

跟踪.NET 4.0引发的GC的来源

如何解决跟踪.NET 4.0引发的GC的来源

| 我正在使用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的代码,但是我一直没有成功。使用MSVS 2010 Professional,我在System.GC.Collect中设置了一个断点,并通过编写一个简单的测试函数(包含对System.GC.Collect的调用)来确保此断点有效。但是,我要调整的应用程序不会在该断点处中断,这使我相信没有代码调用System.GC.Collect。 我想也许是通过直接在mscorwks.dll中调用本机函数并绕过System.GC.Collect来诱导GC的本机代码。我看到System.GC.Collect在mscorwks中的JitHelpers.cpp中调用_Collect。有没有办法在该函数中设置断点?     

解决方法

我仔细观察了PerfMonitor.exe的输出。我不确定每个标记为“ Induced \”的GC是否实际上都是由System.GC.Collect引起的。似乎所有第1代GC都标记为Reason = \“ Induced \”,而所有第0代GC \都标记为Reason = \“ SmallAlloc \”。 Gen2 GC标记为Reason = \“ LowMemory \”。 有一个性能计数器,用于跟踪.NET诱导的GC。我监视了该性能计数器,但在我的过程中没有显示任何诱导的GC。因此,我得出结论说Perfmonitor.exe误导了我。     ,看来您已经推断出GC.Collect()并不是您要解决的问题,但作为参考,我过去曾成功地在GC.Collect中设置断点,当我从诱导型GC计数器中可以看到肯定是GC正在发生。 您可以将断点位置设置为System.GC.Collect并进行操作。使用这种策略,有时可以成功设置框架断点,有时不能成功。我不知道这是因为方法/属性调用已优化,还是其他原因。但这始终值得一试。您可能需要做一些事情,例如在“工具”->“选项”->“调试”部分中禁用“仅我的代码”。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。