PerfMonitor.exe(http://bcl.codeplex.com/wikipage?title=PerfMonitor)を使用して、ネイティブコードであるサードパーティライブラリを使用する.NET4.0アプリの.NETパフォーマンスの問題を追跡しています。 。
Perfmonitor GCTimeレポートを実行すると、個々のGCが一覧表示され、いくつかの方法で分類されます。レポートの1つの列は「理由」と呼ばれます。一部の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を呼び出していることがわかります。その関数にブレークポイントを設定する方法はありますか?