日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 客户端内存优化分析

發(fā)布時間:2023/12/4 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 客户端内存优化分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景概述

C# 開發(fā)客戶端系統(tǒng)的時候,.net 框架本身就比較消耗內(nèi)存資源,特別是xp 這種老爺機(jī)內(nèi)存配置不是很高的電腦上運行,所以就需要進(jìn)行內(nèi)存上的優(yōu)化,才能流暢的在哪些低端電腦上運行. 想要對C# 開發(fā)的客戶端內(nèi)存優(yōu)化需要了解以下幾個概念。

虛擬內(nèi)存

?這里引用百度百科的概念:虛擬內(nèi)存是計算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個連續(xù)完整的地址空間),而實際上,它通常是被分隔成多個物理內(nèi)存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進(jìn)行數(shù)據(jù)交換。目前,大多數(shù)操作系統(tǒng)都使用了虛擬內(nèi)存,如Windows家族的“虛擬內(nèi)存”;Linux的“交換空間”等。

一句話概括虛擬內(nèi)存既是使用磁盤,物理磁盤進(jìn)行虛擬化出來的內(nèi)存空間。

物理內(nèi)存

物理內(nèi)存(Physical memory)是相對于虛擬內(nèi)存而言的。物理內(nèi)存指通過物理內(nèi)存條而獲得的內(nèi)存空間,而虛擬內(nèi)存則是指將硬盤的一塊區(qū)域劃分來作為內(nèi)存。內(nèi)存主要作用是在計算機(jī)運行時為操作系統(tǒng)和各種程序提供臨時儲存。常見的物理內(nèi)存規(guī)格有256M、512M、1G、2G等,現(xiàn)如今隨著計算機(jī)硬件的發(fā)展,已經(jīng)出現(xiàn)4G、8G甚至更高容量的內(nèi)存規(guī)格。當(dāng)物理內(nèi)存不足時,可以用虛擬內(nèi)存代替。在應(yīng)用中,自然是顧名思義,物理上,真實存在的插在主板內(nèi)存槽上的內(nèi)存條的容量的大小。看計算機(jī)配置的時候,主要看的就是這個物理內(nèi)存。

GC 垃圾回收機(jī)制

簡介

C#中和Java一樣是一種系統(tǒng)自動回收釋放資源的語言,在C#環(huán)境中通過 GC(Garbage Collect)進(jìn)行系統(tǒng)資源回收,在數(shù)據(jù)基本類型中介紹到,C#數(shù)據(jù)類型分為引用類型和值類型,

值類型保存在Stack上,隨著函數(shù)的執(zhí)行作用域執(zhí)行完畢而自動出棧,所以這一類型的資源不是GC所關(guān)心 對象。GC垃圾回收主要是是指保存在Heap上的資源。

.NET的GC機(jī)制有這樣兩個問題:

- 首先,GC并不是能釋放所有的資源。它不能自動釋放非托管資源。

- 第二,GC并不是實時性的,這將會造成系統(tǒng)性能上的瓶頸和不確定性。

  

GC并不是實時性的,這會造成系統(tǒng)性能上的瓶頸和不確定性。所以有了IDisposable接口,IDisposable接口定義了Dispose方法,這個方法用來供程序員顯式調(diào)用以釋放非托管資源。使用using語句可以簡化資源管理。

托管資源和非托管資源

上面介紹到,GC只釋放托管資源,那么什么是托管資源和非托管資源。

- 托管資源? ?:托管資源指的是.NET可以自動進(jìn)行回收的資源,主要是指托管堆上分配的內(nèi)存資源。托管資源的回收工作是不需要人工干預(yù)的,有.NET運行庫在合適調(diào)用垃圾回收器進(jìn)行回收。

- 非托管資源:非托管資源指的是.NET不知道如何回收的資源,最常見的一類非托管資源是包裝操作系統(tǒng)資源的對象,例如文件,窗口,網(wǎng)絡(luò)連接,數(shù)據(jù)庫連接,畫刷,圖標(biāo) 等。這類資源,

垃圾回收器在清理的時候會調(diào)用Object.Finalize()方法。默認(rèn)情況下,方法是空的,對于非托管對象,需要在此方法中編寫回收非托管資源的代碼,以便垃圾回收器正確回收資源。

總結(jié):托管資源是釋放由GC來完成,釋放的時間吧不一定,一般是系統(tǒng)感覺內(nèi)存吃緊,會進(jìn)行緊急回收資源。一個對象想成為被回收,首先需要成為垃圾,GC是通過判斷對象及其子對象有沒有指向有效的引用,

如果沒有GC就認(rèn)為它是垃圾。垃圾回收機(jī)制通過一定的算法得到哪些沒有被被引用、或者不再調(diào)用的資源,當(dāng)這些垃圾達(dá)到一定的數(shù)量時,會啟動垃圾回收機(jī)制,GC回收實際上是調(diào)用了析構(gòu)函數(shù)。

垃圾回收機(jī)制意味著你不需要擔(dān)心處理不再需要的對象了。咱們關(guān)心的主要是非托管資源的釋放。

垃圾回收時對象一共有三代 :0,1,2。每一代都有自己的內(nèi)存預(yù)算,空間不足的時候會調(diào)用垃圾回收。為了提高性能都是按代回收,第0代超預(yù)算之后就回收第0代的對象,而存活下來的對象就提升為第1代,

依次類推,而往往經(jīng)過多次0代的垃圾回收才能回收一次第1代。

GC進(jìn)行垃圾回收是系統(tǒng)決定的,下面是進(jìn)行強(qiáng)制回收的執(zhí)行代碼(非特殊情況下不要使用此方法,會影響系統(tǒng)效率,削弱垃圾回收器中優(yōu)化引擎的作用,而垃圾回收器可以確定運行垃圾回收的最佳時間)

//對所有代進(jìn)行垃圾回收。 GC.Collect(); //對指定的代進(jìn)行垃圾回收。 GC.Collect(int generation); //強(qiáng)制在 System.GCCollectionMode 值所指定的時間對零代到指定代進(jìn)行垃圾回收。 GC.Collect(int?generation,?GCCollectionMode?mode);?

關(guān)于 SetProcessWorkingSetSize 和內(nèi)存釋放

?在應(yīng)用程序中,往往為了釋放內(nèi)存等,使用一些函數(shù),其實,對于內(nèi)存操作函數(shù)要謹(jǐn)慎使用,比如大家常常想到的 SetProcessWorkingSetSize,其實對于windows來說,系統(tǒng)會自動在程序閑置時(如程序被最小化)釋放內(nèi)存的,自己用內(nèi)存釋放 時,往往會造成一些莫名的內(nèi)存錯誤,造成自己的應(yīng)用程序及系統(tǒng)不穩(wěn)定。

SetProcessWorkingSetSize的作用

- 物理內(nèi)存轉(zhuǎn)移到虛擬內(nèi)存中

? - msdn解釋:使用這個函數(shù)來設(shè)置應(yīng)用程序最小和最大的運行空間,只會保留需要的內(nèi)存.當(dāng)應(yīng)用程序被閑置或系統(tǒng)內(nèi)存太低時,操作系統(tǒng)會自動調(diào)用這個機(jī)制來設(shè)置應(yīng)用程序的內(nèi)存.應(yīng)用程序也可以使用 VirtualLock 來鎖住一定范圍的內(nèi)存不被系統(tǒng)釋放;當(dāng)你加大運行空間給應(yīng)用程序,你能夠得到的物理內(nèi)存取決于系統(tǒng),這會造成其他應(yīng)用程序降低性能或系統(tǒng)總體降低性能,這也可能導(dǎo)致請求物理內(nèi)存的操作失敗,例如:建立 進(jìn)程,線程,內(nèi)核池,就必須小心的使用該函數(shù).也就是說,該函數(shù)不是節(jié)省內(nèi)存,而是強(qiáng)制把進(jìn)程的物理內(nèi)存搬到虛擬內(nèi)存中.

SetProcessWorkingSetSize 的劣勢

- 危害:如果 SetProcessWorkingSetSize 函數(shù)被正常使用,是非常有用處的.但是為了蒙騙用戶的眼睛,每秒,甚至幾十毫秒就把大量內(nèi)存往虛擬內(nèi)存里面壓,就會帶來無可預(yù)計的危害.看看這篇文章怎么 說:“因為他只是暫時的將應(yīng)用程序占用的內(nèi)存移至虛擬內(nèi)存,一旦,應(yīng)用程序被激活或者有操作請求時,這些內(nèi)存又會被重新占用.如果你強(qiáng)制使用該方法來設(shè)置 程序占用的內(nèi)存,那么可能在一定程度上反而會降低系統(tǒng)性能,因為系統(tǒng)需要頻繁的進(jìn)行內(nèi)存和硬盤間的頁面交換.”.

優(yōu)化內(nèi)存代碼:

[DllImport("kernel32.dll")] private static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);private void FlushMemory() {GC.Collect();GC.WaitForPendingFinalizers();if (Environment.OSVersion.Platform == PlatformID.Win32NT){SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);} }

總結(jié)

以上是生活随笔為你收集整理的C# 客户端内存优化分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。