[英]Suppressing C# garbage collection
我的應用程序分配了大量的內存(數百萬個小對象,總計幾千兆字節)並且長時間保留它。
更新:Perf計數器“GC中的%時間”顯示平均值為10.6%。
除非您可以確認垃圾收集器正在積極地降低應用程序的性能,否則您不應采取措施來削弱運行時環境的功能。
從您的問題判斷,您尚未確認GC是一個問題。 我嚴重懷疑它是。
僅優化需要優化的內容。
查看System.Runtime.GCSettings.LatencyMode
屬性。
在app.config中將GCServer屬性設置為true也有助於減少GC(在我的情況下,啟用時減少10倍GC)。
您可以使用性能監視器進行測量。 打開perfmon並添加與.NET CLR Memory相關的性能計數器。 這些計數器是特定於流程的,您可以使用它們跟蹤各代的集合數量和大小,並且更加特別地為您指定“GC中的%時間”。 以下是此計數器的說明文字:
GC中的%時間是自上一個GC循環以來執行垃圾收集(GC)所花費的時間百分比。 此計數器通常表示垃圾收集器代表應用程序收集和壓縮內存所做的工作。 此計數器僅在每個GC結束時更新,計數器值反映最后觀察到的值; 它不是一般的。
如果您在運行程序時觀察這些計數器,則應該根據您的內存決策來回答GC的頻率和成本。
以下是各種GC性能計數器的良好討論。 似乎10%的邊界沒問題。
它只會(通常)發生在GC需要一些gen2內存時(因為gen1已滿)。 你是在推測性地問這個問題,還是GC實際上有一個問題,因為你占用了大部分的執行時間? 如果您沒有問題,我建議您暫時不要擔心 - 但請注意性能監視器。
我的ASP.NET應用程序 - B2B系統 - 當第一個用戶訪問它時,用於啟動35-40MB。 在這么幾分鍾之后,應用程序過去常常增長到180 MB,有2或3個用戶點擊頁面。 在閱讀.net開發最佳實踐和GC性能指南后,我發現問題是我的應用程序設計。 我立刻不同意。
我對於犯錯是多么容易感到震驚。 我放棄了許多功能,並開始輕松一些對象。 含義:
避免混合這么多頁面以及智能和交流的用戶控件(具有許多功能的控件,這些功能實際上對於使用此控件的每個頁面最常存在)。
停止在基類上產生通用功能。 有時候最好重復一次。 繼承是成本。
在一些復雜的功能上,我將所有內容放在同一個函數上 是的,最多達到100行。 當我在.net性能指導中閱讀這篇建議時,我不相信它,但它有效。 調用堆棧是一個問題,使用類屬性超過局部變量是一個問題。 班級變量可能是一個地獄......
停止使用復雜的基類,不應存在超過7行的基類。 如果你在整個框架上傳播更大的類,你就會遇到問題。
我開始使用更多的靜態對象和功能。 我看到其他人設計的應用程序。 所有dataaccess對象方法(插入,更新,刪除,選擇)都是靜態的。 具有更多並發用戶的應用程序永遠不會超過45MB。
為了節省一些項目,我喜歡改變狀態模式。 我在現實世界中學到了,但作者Nygard也在他的書上同意我的觀點:發布IT - 設計和部署生產就緒軟件。 他把這種方法稱為穩態模式。 這種模式表明我們可能需要一些東西來釋放閑置資源。
您可能想要在機器配置文件上玩。 在屬性memoryLimit上,您將指示在進程回收之前可以達到的內存百分比。
您可能還希望使用機器配置文件。 在此屬性上,GC將指示機器行為(Workstation GC和Server GC)。 此選項也可能會顯着改變內存消耗行為。
當我開始關心這些物品時,我取得了很大的成功。 希望這有幫助。
- 編輯於04-05-2014由於GC新版本的改進以及HTML 5和MVC框架的進步,我已經改變了很多想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.