1. 程式人生 > >C# Winform應用程式佔用記憶體較大解決方法整理(轉)

C# Winform應用程式佔用記憶體較大解決方法整理(轉)

原文: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,close 4、用timer,每幾秒鐘呼叫:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具體見附錄。 5、釋出的時候選擇Release 6、注意程式碼編寫時少產生垃圾,比如String + String就會產生大量的垃圾,可以用StringBuffer.Append 7、this.Dispose();    this.Dispose(True);   this.Close();    GC.Collect();    8、注意變數的作用域,具體說某個變數如果只是臨時使用就不要定義成成員變數。GC是根據關係網去回收資源的。 9、檢測是否存在記憶體洩漏的情況,詳情可參見:記憶體洩漏百度百科 附錄:定期清理執行垃圾回收程式碼: //在程式中用一個計時器,每隔幾秒鐘呼叫一次該函式,開啟工作管理員,你會有驚奇的發現 複製程式碼
#region 記憶體回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 釋放記憶體
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if
(Environment.OSVersion.Platform == PlatformID.Win32NT) { App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); } } #endregion
複製程式碼