Отслеживание источника .NET 4.0 Induced GC - PullRequest
3 голосов
/ 24 мая 2011

Я использую 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. Есть ли способ установить точку останова в этой функции?

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

Похоже, вы пришли к выводу, что GC.Collect () здесь не является вашей проблемой, но для справки, я преуспел в том, чтобы поставить точки останова в GC.Collect в прошлом, когда я мог видеть по счетчику Induced GC, что былиОпределенно вызванные GC происходят.

Вы можете установить точку останова для System.GC.Collect и попробовать.Используя эту тактику, я иногда успешно устанавливаю точки останова Framework, иногда нет.Я не знаю, происходит ли это потому, что вызовы методов / свойств оптимизированы, или по какой-то другой причине.Но это всегда стоит попробовать.Возможно, вам придется выполнить такие действия, как отключение «Просто мой код» в разделе «Инструменты-> Параметры-> Отладка».

0 голосов
/ 24 мая 2011

Я посмотрел немного ближе к выводу PerfMonitor.exe.Я не уверен, что каждый GC, помеченный как «Индуцированный», фактически вызывается System.GC.Collect.Похоже, что все GC 1-го поколения помечены как Reason = "Induced", а все GC Gen 0 помечены как Reason = "SmallAlloc".ГХ Gen2 помечены как Reason = "LowMemory".

Существует счетчик производительности для отслеживания .NET-индуцированных ГХ.Я отслеживал этот счетчик производительности, и он не показывает никаких индуцированных GC в моем процессе.Итак, я заключаю, что Perfmonitor.exe ввел меня в заблуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...