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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM