原文:http://www.jb51.net/article/56682.htm架構
背景:
微軟的 .NET FRAMEWORK 如今可謂如火如荼了。可是,.NET 一直所爲人詬病的就是「胃口太大」,狂吃內存,雖然微軟聲稱 GC 的功能和智能化都很高,可是內存的回收問題,一直存在困擾,尤爲是 winform 程序,其主要緣由是由於.NET程序在啓動時,是須要由JIT動態編譯並加載的,這個加載會把全部須要的資源都加載進來,不少資源是隻有啓動時才用的。
以XP 系統爲例子,程序啓動後,打開任務管理器,會看到佔用的內存量比較大,你把程序最小化,會發現該程序佔用的內存迅速減少到一個很小的值,再恢復你的程序,你會發現內存佔用又上升了,可是比你剛啓動時的內存佔用值仍是小的,這就是一個資源優化的過程,這個過程是操做系統主動完成的。
結論與展望:
創新設計大賽的項目已經快到交付的日期了,
都說Winform佔用內存大,因而想着看看本身寫的基於手機郵件的遠程關機軟件(Mail_Based_Remote_Shutdown)佔用內存狀況,
整個開發過程本身也在儘可能寫一些比較優美的代碼來減小系統內存佔用,今天看了下,剛打開時佔用20M內存,
而後一點點增長,最後到80多M,真是沒法忍受,
每次都是寫了以後回過頭來才發現本身的代碼很醜,系統架構師的做用就體現出來了。
這裏整理了一些網上關於Winform如何下降系統內存佔用的資料,供參考,待更新:
一、使用性能測試工具dotTrace 3.0,它可以計算出你程序中那些代碼佔用內存較多
二、強制垃圾回收
三、多dispose,close
四、用timer,每幾秒鐘調用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具體見附錄。
五、發佈的時候選擇Release
六、注意代碼編寫時少產生垃圾,好比String + String就會產生大量的垃圾,能夠用StringBuffer.Append
七、this.Dispose(); this.Dispose(True); this.Close(); GC.Collect();
八、注意變量的做用域,具體說某個變量若是隻是臨時使用就不要定義成成員變量。GC是根據關係網去回收資源的。
九、檢測是否存在內存泄漏的狀況,詳情可參見:內存泄漏百度百科
附錄:按期清理執行垃圾回收代碼:
//在程序中用一個計時器,每隔幾秒鐘調用一次該函數,打開任務管理器,你會有驚奇的發現
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