C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn)_第1頁
C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn)_第2頁
C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn)_第3頁
C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn)使用wpf程序常常會出現(xiàn)一個問題,那就是內(nèi)存占用過高,使用wpf的程序功能越復(fù)雜往往用著用著內(nèi)存就本著90往上去了。

一方面wpf本身是一個ui框架,對圖像以及界面的渲染雖然提高了軟件的美觀性,但實際使用過程中調(diào)用和消耗了大量的內(nèi)存來進行協(xié)同處理;

另一方面這些調(diào)用的內(nèi)存的確在使用完成之后并沒有進行主動的釋放或者是只是自動釋放了一部分,即對于托管資源通過GC自動清理回收。對于非托管資源,通過代碼調(diào)用手動進行清除,再由GC回收。例如流,數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接等,所以就需要我們主動定時的對內(nèi)存進行回收釋放的處理。

在這里非常推薦使用LierdaCracker

一.可以使用nuget管理安裝Lierda.WPFHelper包,在項目的App.xaml.cs中的Application_Startup方法里實例化并調(diào)用cracker方法直接使用

LierdaCrackercracker=newLierdaCracker();

cracker.Cracker();

二.自己實現(xiàn)LierdaCracker類

提到C#資源和內(nèi)存回收肯定少不了GC垃圾回收機制,托管堆上的內(nèi)存由GC全權(quán)負(fù)責(zé),值引用的在棧上的內(nèi)存會隨著??臻g的消亡而自動消失。

GC.Collect();

GC.WaitForPendingFinalizers();

此方法強制對所有代進行即時垃圾回收!

當(dāng)應(yīng)用程序代碼中某個確定的點上使用的內(nèi)存量大量減少時,在這種情況下使用GC.Collect方法可能比較合適。而GC.WaitForPendingFinalizers則是提供收集完成前的等待。

另外一個非常重要的系統(tǒng)api在釋放內(nèi)存的時候也是非常重要的

SetProcessWorkingSetSize,使用這個函數(shù)來設(shè)置應(yīng)用程序最小和最大的運行空間,只會保留需要的內(nèi)存。當(dāng)應(yīng)用程序被閑置或系統(tǒng)內(nèi)存太低時,操作系統(tǒng)會自動調(diào)用這個機制來設(shè)置應(yīng)用程序的內(nèi)存。應(yīng)用程序也可以使用VirtualLock來鎖住一定范圍的內(nèi)存不被系統(tǒng)釋放。

事實上,使用該函數(shù)并不能提高什么性能,也不會真的節(jié)省內(nèi)存。

因為他只是暫時的將應(yīng)用程序占用的內(nèi)存移至虛擬內(nèi)存,一旦,應(yīng)用程序被激活或者有操作請求時,這些內(nèi)存又會被重新占用。如果你強制使用該方法來設(shè)置程序占用的內(nèi)存,那么可能在一定程度上反而會降低系統(tǒng)性能,因為系統(tǒng)需要頻繁的進行內(nèi)存和硬盤間的頁面交換。

BOOLSetProcessWorkingSetSize(

HANDLEhProcess,

SIZE_TdwMinimumWorkingSetSize,

SIZE_TdwMaximumWorkingSetSize

);

將2個SIZE_T參數(shù)設(shè)置為-1,即可以使進程使用的內(nèi)存交換到虛擬內(nèi)存,只保留一小部分代碼,它是windowsNT的api所以使用的使用需要加上平臺條件。

if(Environment.OSVersion.Platform==PlatformID.Win32NT)

SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,-1,-1);

綜合下來LierdaCracker類為

publicclassLierdaCracker

[DllImport("kernel32.dll")]

privatestaticexternboolSetProcessWorkingSetSize(IntPtrproc,intmin,intmax);

privatevoidFlushMemory()

{

GC.Collect();

GC.WaitForPendingFinalizers();

if(Environment.OSVersion.Platform==PlatformID.Win32NT)

SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,-1,-1);

}

publicvoidCracker(intsleepSpan=50)

{

_=Task.Factory.StartNew(delegate

{

while(true)

{

try

{

SetDate();

FlushMemory();

Thread.Sleep(TimeSpan.FromSeconds

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論