亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳細(xì)分析c# 客戶端內(nèi)存優(yōu)化

 更新時(shí)間:2020年07月06日 08:57:14   作者:Jlion  
這篇文章主要介紹了c# 客戶端內(nèi)存優(yōu)化的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

背景概述

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

虛擬內(nèi)存

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

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

物理內(nèi)存

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

GC 垃圾回收機(jī)制

簡(jiǎn)介

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

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

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

  • 首先,GC并不是能釋放所有的資源。它不能自動(dòng)釋放非托管資源。
  • 第二,GC并不是實(shí)時(shí)性的,這將會(huì)造成系統(tǒng)性能上的瓶頸和不確定性。

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

托管資源和非托管資源

上面介紹到,GC只釋放托管資源,那么什么是托管資源和費(fèi)托管資源。

  • 托管資源 : 托管資源指的是.NET可以自動(dòng)進(jìn)行回收的資源,主要是指托管堆上分配的內(nèi)存資源。托管資源的回收工作是不需要人工干預(yù)的,有.NET運(yùn)行庫(kù)在合適調(diào)用垃圾回收器進(jìn)行回收。
  • 非托管資源:非托管資源指的是.NET不知道如何回收的資源,最常見(jiàn)的一類非托管資源是包裝操作系統(tǒng)資源的對(duì)象,例如文件,窗口,網(wǎng)絡(luò)連接,數(shù)據(jù)庫(kù)連接,畫(huà)刷,圖標(biāo) 等。這類資源,

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

  • 總結(jié):托管資源是釋放由GC來(lái)完成,釋放的時(shí)間吧不一定,一般是系統(tǒng)感覺(jué)內(nèi)存吃緊,會(huì)進(jìn)行緊急回收資源。一個(gè)對(duì)象想成為被回收,首先需要成為垃圾,GC是通過(guò)判斷對(duì)象及其子對(duì)象有沒(méi)有指向有效的引用,如果沒(méi)有GC就認(rèn)為它是垃圾。垃圾回收機(jī)制通過(guò)一定的算法得到哪些沒(méi)有被被引用、或者不再調(diào)用的資源,當(dāng)這些垃圾達(dá)到一定的數(shù)量時(shí),回啟動(dòng)垃圾回收機(jī)制,GC回收實(shí)際上是調(diào)用了析構(gòu)函數(shù)。垃圾回收機(jī)制意味著你不需要擔(dān)心處理不再需要的對(duì)象了。咱們關(guān)心的主要是非托管資源的釋放。垃圾回收時(shí)對(duì)象一共有三代 :0,1,2。每一代都有自己的內(nèi)存預(yù)算,空間不足的時(shí)候會(huì)調(diào)用垃圾回收。為了提高性能都是按代回收,第0代超預(yù)算之后就回收第0代的對(duì)象,而存活下來(lái)的對(duì)象就提升為第1代,依次類推,而往往經(jīng)過(guò)多次0代的垃圾回收才能回收一次第1代。

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

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

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

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

SetProcessWorkingSetSize的作用

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

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

SetProcessWorkingSetSize 的劣勢(shì)

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

優(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);
  }
}

以上就是詳細(xì)分析c# 客戶端內(nèi)存優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于c# 客戶端內(nèi)存優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:

相關(guān)文章

  • C# WPF中實(shí)現(xiàn)圖表生成的五種方式

    C# WPF中實(shí)現(xiàn)圖表生成的五種方式

    在現(xiàn)代應(yīng)用程序中,數(shù)據(jù)可視化是一個(gè)重要的功能,它可以幫助用戶更直觀地理解數(shù)據(jù),在C# WPF中,有多種方式可以生成圖表,以下是五種常見(jiàn)的方法,每種方法都有其獨(dú)特的優(yōu)勢(shì)和局限,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-09-09
  • C#利用異或算法實(shí)現(xiàn)加密解密

    C#利用異或算法實(shí)現(xiàn)加密解密

    這篇文章主要為大家詳細(xì)介紹了C#如何利用異或算法實(shí)現(xiàn)加密解密的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • c# 單例模式的實(shí)現(xiàn)

    c# 單例模式的實(shí)現(xiàn)

    這篇文章主要介紹了c# 單例模式的實(shí)現(xiàn)方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • 在多線程中調(diào)用winform窗體控件的實(shí)現(xiàn)方法

    在多線程中調(diào)用winform窗體控件的實(shí)現(xiàn)方法

    這篇文章主要介紹了在多線程中調(diào)用winform窗體控件的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值

    C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值

    這篇文章主要介紹了C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-06-06
  • C#如何解析http報(bào)文

    C#如何解析http報(bào)文

    這篇文章如果講解了用C#如何解析http報(bào)文,要解析http報(bào)文,需要哪些操作呢?下面小編給大家整理相關(guān)資料,需要的朋友可以參考下
    2015-08-08
  • C#中調(diào)用Servlet示例

    C#中調(diào)用Servlet示例

    這篇文章主要介紹了C#中調(diào)用Servlet示例,本文實(shí)現(xiàn)通用消息接口使用servlet作為服務(wù)器端服務(wù)接口,第三方應(yīng)用程序通過(guò)http post的方式調(diào)用servlet,實(shí)現(xiàn)與通用消息接口的調(diào)用連接,需要的朋友可以參考下
    2015-05-05
  • c#值類型和引用類型使用示例

    c#值類型和引用類型使用示例

    這篇文章主要介紹了c#值類型和引用類型使用示例,需要的朋友可以參考下
    2014-04-04
  • C#基于WinForm實(shí)現(xiàn)串口通訊

    C#基于WinForm實(shí)現(xiàn)串口通訊

    這篇文章主要為大家詳細(xì)介紹了C#基于WinForm實(shí)現(xiàn)串口通訊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 那些年,我還在學(xué)習(xí)C# 學(xué)習(xí)筆記續(xù)

    那些年,我還在學(xué)習(xí)C# 學(xué)習(xí)筆記續(xù)

    那些年學(xué)習(xí)C#,就是對(duì)C#相關(guān)的一些知識(shí)有一個(gè)了解,等到要用時(shí)才不會(huì)找不到方向,比如說(shuō)擴(kuò)展方法,開(kāi)始時(shí)怎么覺(jué)得沒(méi)有用,后來(lái)了解到asp.net MVC,它可以用來(lái)擴(kuò)展Html類,比如做一個(gè)分頁(yè)的方法;所以對(duì)一門(mén)語(yǔ)言了解寬一些是沒(méi)有壞處的
    2012-03-03

最新評(píng)論