標籤:winform style blog http io color ar os 使用
原文:http://www.jb51.net/article/56682.htm
背景:微軟的 .NET FRAMEWORK 現在可謂如火如荼了。但是,.NET 一直所為人詬病的就是“胃口太大”,狂吃記憶體,雖然微軟聲稱 GC 的功能和智能化都很高,但是記憶體的回收問題,一直存在困擾,尤其是 winform 程式,其主要原因是因為.NET程式在啟動時,是需要由JIT動態編譯並載入的,這個載入會把所有需要的資源都載入進來,很多資源是只有啟動時才用的。以XP 系統為例子,程式啟動後,開啟工作管理員,會看到佔用的記憶體量比較大,你把程式最小化,會發現該程式佔用的記憶體迅速減小到一個很小的值,再恢複你的程式,你會發現記憶體佔用又上升了,但是比你剛啟動時的記憶體佔用值還是小的,這就是一個資源最佳化的過程,這個過程是作業系統主動完成的。結論與展望:創新設計大賽的項目已經快到交付的日期了,都說Winform佔用記憶體大,於是想著看看自己寫的基於手機郵件的遠程關機軟體(Mail_Based_Remote_Shutdown)佔用記憶體情況,整個開發過程自己也在盡量寫一些比較優美的代碼來減少系統記憶體佔用,今天看了下,剛開啟時佔用20M記憶體,然後一點點增加,最後到80多M,真是無法忍受,每次都是寫了之後回過頭來才發現自己的代碼很醜,系統架構師的作用就體現出來了。這裡整理了一些網上關於Winform如何降低系統記憶體佔用的資料,供參考,待更新:1、使用效能測試工具dotTrace 3.0,它能夠計算出你程式中那些代碼佔用記憶體較多2、強制記憶體回收3、多dispose,close4、用timer,每幾秒鐘調用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具體見附錄。5、發布的時候選擇Release6、注意代碼編寫時少產生垃圾,比如String + String就會產生大量的垃圾,可以用StringBuffer.Append7、this.Dispose(); this.Dispose(True); this.Close(); GC.Collect(); 8、注意變數的範圍,具體說某個變數如果只是臨時使用就不要定義成成員變數。GC是根據關係網去回收資源的。9、檢測是否存在記憶體流失的情況,詳情可參見:記憶體流失百度百科 附錄:定期清理執行記憶體回收代碼://在程式中用一個計時器,每隔幾秒鐘調用一次該函數,開啟工作管理員,你會有驚奇的發現
1 #region 記憶體回收 2 [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")] 3 public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize); 4 /// <summary> 5 /// 釋放記憶體 6 /// </summary> 7 public static void ClearMemory() 8 { 9 GC.Collect();10 GC.WaitForPendingFinalizers();11 if (Environment.OSVersion.Platform == PlatformID.Win32NT)12 {13 App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);14 }15 }16 #endregion
C# Winform應用程式佔用記憶體較大解決方案整理(轉)