背景概述
c# 開發客戶端系統的時候,.net 框架本身就比較消耗記憶體資源,特別是xp 這種老爺機記憶體配置不是很高的電腦上執行,所以就需要進行記憶體上的優化,才能流暢的在哪csgwabn些低端電腦上執行. 想要對c# 開發的客戶端記憶體優化需要了解以下幾個概念。
虛擬記憶體
這裡引用百度百科的概念:虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體(乙個連續完整的位址空間),而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。目前,大多數作業系統都使用了虛擬記憶體,如windows家族的「虛擬記憶體」;linux的「交換空間」等。
一句話概括虛擬記憶體既是使用磁碟,物理磁碟進行虛擬化出來的記憶體空間。
物理記憶體
物理記憶體(physical memory)是相對於虛擬記憶體而言的。物理記憶體指通過物理記憶體條而獲得的記憶體空間,而虛擬記憶體則是指將硬碟的一塊區域劃分來作為記憶體。記憶體主要作用是在計算機執行時為作業系統和各種程式提供臨時儲存。常見的物理記憶體規格有256m、512m、1g、2g等,現如今隨著計算機硬體的發展,已經出現4g、8g甚至更高容量的記憶體規格。當物理記憶體不足時,可以用虛擬記憶體代替。在應用中,自然是顧名思義,物理上,真實存在的插在主機板記憶體槽上的記憶體條的容量的大小。看計算機配置的時候,主要看的就是這個物理記憶體。
gc 垃圾**機制
簡介c#中和j**a一樣是一種系統自動**釋放資源的語言,在c#環境中通過 gc(garbage collect)進行系統csgwabn資源**,在資料基本型別中介紹到,c#資料型別分為引用型別和值型別,
值型別儲存在stack上,隨著函式的執行作用域執行完畢而自動出棧,所以這一型別的資源不是gc所關心 物件。gc垃圾**主要是是指儲存在heap上的資源。
.net的gc機制有這樣兩個問題:
gc並不是實時性的,這會造成系統效能上的瓶程式設計客棧頸和不確定性。所以有了idisposable介面,idisposable介面定義了dispose方法,這個方法用來供程式設計師顯式呼叫以釋放非託管資源。使用using語句可以簡化資源管理。
託管資源和非託管資源
上面介紹到,gc只釋放託管資源,那麼什麼是託管資源和費託管資源。
垃圾**器在清理的時候會呼叫object.finalize()方法。預設情況下,方法是空的,對於非託管物件,需要在此方法中編寫**非託管資源的**,以便垃圾**器正確**資源。
gc進行垃圾**是系統決定的,下面是進行強制**的執行**(非特殊情況下不要使用此方法,會影響系統效率,削弱垃圾**器中優化引擎的作用,而垃圾**器可以確定執行垃圾**的最佳時間)
//對所有代進行垃圾**。
gc.collect();
//對指定的代進行垃圾**。
gc.collect(int generation);
//強制在 system.gccollectionmode 值所指定的時間對零代到指定代進行垃圾**。
gc.collect(int generation, gccollectionmode mode);
關於 setprocessworkingsetsize 和記憶體釋放
在應用程式中,往往為了釋放記憶體等,使用一些函式,其實,對於記憶體操作函式要謹慎使用,比如大家常常想到的 setprocessworkingsetsize,其實對於windows來說,系統會自動在程式閒置時(如程式被最小化)釋放記憶體的,自己用記憶體釋放 時,往往會造成一些莫名的記憶體錯誤,造成自己的應用程式及系統不穩定。
setprocessworkingsetsize的作用
物理記憶體轉移到虛擬記憶體中
setprocessworkingswww.cppcns.cometsize 的劣勢
優化記憶體**:
[dllimport("kernel32.dll")]
private static extern bool setprocessworkingsetsize(intptr proc, int min, int max);
private void flushmemory()
}
記憶體洩露檢測詳細分析
詳細分析記憶體洩露檢測 一般我們常說的記憶體洩漏是指堆記憶體的洩漏。堆記憶體是指程式從堆中分配的,使用完後必須顯式釋放的記憶體。c 中使用new和new實現從堆中分配到一塊記憶體,使用完後,程式必須負責相應的呼叫delete或delete釋放該記憶體塊,否則,這塊記憶體就不能被再次使用,我們就說這塊...
C 陣列 詳細分析
c 陣列 詳細分析 摘自 1 陣列下標 1 在定義時必須明確。只能用正整數或const常量,靜態或全域性變數不可以 例如 const int length 5 int array length 特 在new時可以用變數做下標。例如 int array new int variable 2 在初始化時...
C 陣列 詳細分析
1 陣列下標 1 在定義時必須明確。只能用正整數或const常量,靜態或全域性變數不可以 例如 const int length 5 int array length 特 在new時可以用變數做下標。例如 int array new int variable 2 在初始化時 一維陣列,可略 例如 i...