Я использую PerfMonitor.exe (http://bcl.codeplex.com/wikipage?title=PerfMonitor), чтобы отследить некоторые проблемы с производительностью .NET приложения .NET 4.0, в котором используются сторонние библиотеки, некоторые из которых являются собственным кодом.
Когда я запускаю отчет Perfmonitor GCTime, он перечисляет отдельные GC и классифицирует их несколькими способами. Один столбец в отчете называется «Причина». Некоторые GC имеют Reason = "Induced", а другие имеют Reason = "SmallAlloc".
Я предполагаю, что GC, помеченные как «SmallAlloc», вызваны регулярным выделением (New Object ()), а GC, помеченные как «Induced», вызваны вызовом «System.GC.Collect». Пожалуйста, дайте мне знать, если вы считаете, что я сделал неверное предположение.
Я пытаюсь найти код, который вызывает System.GC.Collect, но мне это не удалось. Используя MSVS 2010 Professional, я установил точку останова в System.GC.Collect и убедился, что эта точка останова работает, написав простую тестовую функцию, которая содержит вызов System.GC.Collect. Тем не менее, мое приложение, которое я настраиваю, не ломается в этой точке останова, что заставляет меня поверить, что ни один из кода не вызывает System.GC.Collect.
Я думаю, может быть, есть собственный код, который вызывает GC, вызывая нативную функцию в mscorwks.dll напрямую и обойдя System.GC.Collect. Я вижу, что System.GC.Collect вызывает _Collect в JitHelpers.cpp, который находится в mscorwks. Есть ли способ установить точку останова в этой функции?