C# WinForm應(yīng)用程序降低系統(tǒng)內(nèi)存占用方法總結(jié)
背景:
微軟的 .NET FRAMEWORK 現(xiàn)在可謂如火如荼了。但是,.NET 一直所為人詬病的就是“胃口太大”,狂吃?xún)?nèi)存,雖然微軟聲稱(chēng) GC 的功能和智能化都很高,但是內(nèi)存的回收問(wèn)題,一直存在困擾,尤其是 winform 程序,其主要原因是因?yàn)?NET程序在啟動(dòng)時(shí),是需要由JIT動(dòng)態(tài)編譯并加載的,這個(gè)加載會(huì)把所有需要的資源都加載進(jìn)來(lái),很多資源是只有啟動(dòng)時(shí)才用的。
以XP 系統(tǒng)為例子,程序啟動(dòng)后,打開(kāi)任務(wù)管理器,會(huì)看到占用的內(nèi)存量比較大,你把程序最小化,會(huì)發(fā)現(xiàn)該程序占用的內(nèi)存迅速減小到一個(gè)很小的值,再恢復(fù)你的程序,你會(huì)發(fā)現(xiàn)內(nèi)存占用又上升了,但是比你剛啟動(dòng)時(shí)的內(nèi)存占用值還是小的,這就是一個(gè)資源優(yōu)化的過(guò)程,這個(gè)過(guò)程是操作系統(tǒng)主動(dòng)完成的。
結(jié)論與展望:
創(chuàng)新設(shè)計(jì)大賽的項(xiàng)目已經(jīng)快到交付的日期了,都說(shuō)Winform占用內(nèi)存大,于是想著看看自己寫(xiě)的基于手機(jī)郵件的遠(yuǎn)程關(guān)機(jī)軟件(Mail_Based_Remote_Shutdown)占用內(nèi)存情況,整個(gè)開(kāi)發(fā)過(guò)程自己也在盡量寫(xiě)一些比較優(yōu)美的代碼來(lái)減少系統(tǒng)內(nèi)存占用,今天看了下,剛打開(kāi)時(shí)占用20M內(nèi)存,然后一點(diǎn)點(diǎn)增加,最后到80多M,真是無(wú)法忍受,每次都是寫(xiě)了之后回過(guò)頭來(lái)才發(fā)現(xiàn)自己的代碼很丑,系統(tǒng)架構(gòu)師的作用就體現(xiàn)出來(lái)了。
這里整理了一些網(wǎng)上關(guān)于Winform如何降低系統(tǒng)內(nèi)存占用的資料,供參考:
1、使用性能測(cè)試工具dotTrace 3.0,它能夠計(jì)算出你程序中那些代碼占用內(nèi)存較多
2、強(qiáng)制垃圾回收
3、多dispose,close
4、用timer,每幾秒鐘調(diào)用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具體見(jiàn)附錄。
5、發(fā)布的時(shí)候選擇Release
6、注意代碼編寫(xiě)時(shí)少產(chǎn)生垃圾,比如String + String就會(huì)產(chǎn)生大量的垃圾,可以用StringBuffer.Append
7、this.Dispose(); this.Dispose(True); this.Close(); GC.Collect();
8、注意變量的作用域,具體說(shuō)某個(gè)變量如果只是臨時(shí)使用就不要定義成成員變量。GC是根據(jù)關(guān)系網(wǎng)去回收資源的。
9、檢測(cè)是否存在內(nèi)存泄漏的情況,詳情可參見(jiàn):內(nèi)存泄漏百度百科
附錄:定期清理執(zhí)行垃圾回收代碼:
//在程序中用一個(gè)計(jì)時(shí)器,每隔幾秒鐘調(diào)用一次該函數(shù),打開(kāi)任務(wù)管理器,你會(huì)有驚奇的發(fā)現(xiàn)
#region 內(nèi)存回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 釋放內(nèi)存
/// </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
- C#向無(wú)窗口的進(jìn)程發(fā)送消息
- C#微信開(kāi)發(fā)之接收 / 返回文本消息
- C#實(shí)現(xiàn)帶消息數(shù)的App圖標(biāo)
- C#記錄消息到日志文件的方法
- c#取得控制臺(tái)應(yīng)用程序根目錄
- C# 禁止應(yīng)用程序多次啟動(dòng)的實(shí)例
- C#Web應(yīng)用程序入門(mén)經(jīng)典學(xué)習(xí)筆記之二
- C#實(shí)現(xiàn)將應(yīng)用程序設(shè)置為開(kāi)機(jī)啟動(dòng)的方法
- C#Web應(yīng)用程序入門(mén)經(jīng)典學(xué)習(xí)筆記之一
- C#使用windows服務(wù)開(kāi)啟應(yīng)用程序的方法
- C#實(shí)現(xiàn)在應(yīng)用程序間發(fā)送消息的方法示例
相關(guān)文章
淺析C#中的Main(String[] args)參數(shù)輸入問(wèn)題
本篇文章主要是對(duì)C#中的Main(String[] args)參數(shù)輸入問(wèn)題進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01
Windows下C#的GUI窗口程序中實(shí)現(xiàn)調(diào)用Google Map的實(shí)例
這篇文章主要介紹了Windows下C#的GUI窗口程序中實(shí)現(xiàn)調(diào)用Google Map的實(shí)例,如果只想調(diào)用瀏覽器打開(kāi)網(wǎng)頁(yè)的話可以看文章最后的方法,需要的朋友可以參考下2016-04-04
Unity UGUI實(shí)現(xiàn)滑動(dòng)翻頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了Unity UGUI實(shí)現(xiàn)滑動(dòng)翻頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
基于NET?Core?的Nuget包制作、發(fā)布和運(yùn)用流程解析(完整過(guò)程)
這篇文章主要介紹了基于NET?Core?的Nuget包制作、發(fā)布和運(yùn)用流程,本文通過(guò)圖文并茂的形式給大家介紹了Nuget包制作過(guò)程,感興趣的朋友跟隨小編一起看看吧2022-02-02
C#框架winform實(shí)現(xiàn)簡(jiǎn)單點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#框架winform實(shí)現(xiàn)簡(jiǎn)單點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
C#實(shí)現(xiàn)復(fù)雜XML的序列化與反序列化
這篇文章主要介紹了C#實(shí)現(xiàn)復(fù)雜XML的序列化與反序列化的方法,是非常實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-09-09

