在Perf Mon監視我們的應用程序時,我注意到當GC的時間百分比在20-60%之間時,我們的應用程序正在執行長時間運行的過程在30秒到1.5分鐘之間)。這對我來說似乎有點過分。這提出了兩個重要的問題。在Perf Mon中看到高「GC時間百分比」的原因
- 我是否正確,這過多?
- 我可以採取的路線來弄清楚爲什麼這麼多GC發生?
在Perf Mon監視我們的應用程序時,我注意到當GC的時間百分比在20-60%之間時,我們的應用程序正在執行長時間運行的過程在30秒到1.5分鐘之間)。這對我來說似乎有點過分。這提出了兩個重要的問題。在Perf Mon中看到高「GC時間百分比」的原因
是的,這聽起來過度。減少GC數量可能是減少應用程序運行時間的最佳步驟(如果這是您的目標)。
「GC中的%時間」通常是由分配並丟棄數千或數百萬個對象引起的。瞭解發生了什麼的一個好方法是使用內存分析器工具。
Microsoft提供免費CLR Profiler。這會向您顯示每個分配,但會使您的應用程序運行速度降低10-60倍。您可能需要使用較少的輸入數據運行它,以便它可以在合理的時間內完成分析。
偉大的商業工具是SciTech的.NET Memory Profiler。這減少了運行時間的開銷,並且有免費的試用版。通過在進程運行時拍攝多個快照,您可以找出哪些類型的對象經常被分配(然後被銷燬)。
一旦確定了分配的來源,就需要檢查代碼並找出如何減少這些分配。雖然沒有萬能的答案,但我過去遇到的一些問題包括:
另一個原因可能是大量的gen-1或gen-2集合,每個集合都花費很多時間,並且是由於掛在對象上的時間較長造成的。
我看到這種情況發生在網頁應用程序中,當有問題的對象掛在實際的頁面對象上時 - 強制頁面只要引用它們的其他對象就存在。
打破對象和頁面之間的鏈接(在這種情況下)導致GC降至非常低的值。我們的網站現在擁有100+次點擊/秒,GC時間通常爲1%或更少。
我糾正這個過分嗎?
是的,你是正確的
路線我可以弄清楚爲什麼這麼多的GC是怎麼回事?
1.-待辦事項看看PerfView
PerfView是一個性能分析工具,有助於隔離CPU和內存 相關的性能問題。
另請參見:Improving Managed Code Performance
2:查看是否正在您的代碼或第三方庫的任何地方叫GC.Collect的或GC.WaitForPendingFinalizers。後者可能會導致高CPU利用率。
這是ASP.NET嗎? – 2009-07-15 15:17:40