版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C# 中的垃圾回收機(jī)制很多系統(tǒng)都有其自身的垃圾回收,其回收機(jī)制大體是相同的。它們使程序員從跟蹤內(nèi)存使用的繁重任務(wù)中解脫出來。雖然大多數(shù)回收器都要求應(yīng)用程序不時(shí)地暫停從而釋放不再使用的內(nèi)存。但C#中的回收器效率還是很高的。垃圾回收器的基本假定:1.被分配內(nèi)存空間的對(duì)象最有可能被釋放。在方法執(zhí)行時(shí),就需要為該方法的對(duì)象分配內(nèi)存空間,搜索最近分配的對(duì)象集合有助于花費(fèi)最少的代價(jià)來盡可能多地釋放內(nèi)存空間。2.生命期最長的對(duì)象釋放的可能性最小,經(jīng)過幾輪垃圾回收后,對(duì)象仍然存在,搜索它時(shí)就需要進(jìn)行大量的工作,卻只能釋放很小的一部分空間。3.同時(shí)被分配內(nèi)存的對(duì)象通常是同時(shí)使用,將它們彼此相連有助于提高緩存性能
2、和回收效率 。C#中的回收器是分代的垃圾回收器(Gererational Garbage Collector) 它將分配的對(duì)象分為3個(gè)類別或代。(可用GC.GetGeneration方法返回任意作為參數(shù)的對(duì)象當(dāng)前所處的代) 最近被分配內(nèi)存的對(duì)象被放置于第0代,因?yàn)榈?代很小,小到足以放進(jìn)處理器的二級(jí)(L2)緩存,所以它能夠提供對(duì)對(duì)象 的快速存取。經(jīng)過一輪垃圾回收后,仍然保留在第0代中的對(duì)象被移進(jìn)第1代中,再經(jīng)過一輪垃圾內(nèi)存回收后,仍然保留在第1代中的對(duì)象則被移進(jìn)第2代中,第2代中包含了生存期較長的對(duì)象。在C#中值類型是在堆棧中分配內(nèi)存,它們有自身的生命周期,所以不用對(duì)它們進(jìn)行管理,會(huì)自動(dòng)分配和
3、釋放。而引用類型是在堆中分配內(nèi)存的。所以它的分配和釋放就需要像回收機(jī)制來管理。C#為一個(gè)對(duì)象分配內(nèi)存時(shí),托管堆可以立即返回新對(duì)象所需的內(nèi)存,因?yàn)橥泄芏杨愃朴诤?jiǎn)單的字節(jié)數(shù)組,有一個(gè)指向第一個(gè)可用內(nèi)存空間的指針,指針像游標(biāo)一樣向后移動(dòng),一段段內(nèi)存就分配給了正在運(yùn)行的程序的對(duì)象。在不需要太多垃圾回收的程序小,托管堆性能優(yōu)于傳統(tǒng)的堆。當(dāng)?shù)?代中沒有可以分配的有效內(nèi)存時(shí),就觸發(fā)了第0代中的一輪垃圾回收,它將刪除那些不再被引用的對(duì)象,并將當(dāng)前正在使用的對(duì)象移至第1代。而當(dāng)?shù)?代垃圾回收后依然不能請(qǐng)求到充足的內(nèi)存時(shí),就啟動(dòng)第1代垃圾回收。如果對(duì)各代都進(jìn)行了垃圾回收后仍沒有可用的內(nèi)存就會(huì)引發(fā)一個(gè)OutOfMe
4、moryException異常。終結(jié)器在有些情況下,類可以提供一個(gè)終結(jié)器在對(duì)象被銷毀時(shí)執(zhí)行,終結(jié)器是一個(gè)名為Finalize的受保護(hù)的方法:protected void Finalize()base.Finalize();/釋放外部資源垃圾回收器使用名為“終止隊(duì)列”的內(nèi)部結(jié)構(gòu)跟蹤具有 Finalize 方法的對(duì)象。每次您的應(yīng)用程序創(chuàng)建具有 Finalize 方法的對(duì)象時(shí),垃圾回收器都在終止隊(duì)列中放置一個(gè)指向該對(duì)象的項(xiàng)。托管堆中所有需要在垃圾回收器回收其內(nèi)存之前調(diào)用它們的終止代碼的對(duì)象都在終止隊(duì)列中含有項(xiàng)。(實(shí)現(xiàn) Finalize 方法或析構(gòu)函數(shù)對(duì)性能可能會(huì)有負(fù)面影響,因此應(yīng)避免不必要地使用它們
5、。用 Finalize 方法回收對(duì)象使用的內(nèi)存需要至少兩次垃圾回收。當(dāng)垃圾回收器執(zhí)行回收時(shí),它只回收沒有終結(jié)器的不可訪問對(duì)象的內(nèi)存。這時(shí),它不能回收具有終結(jié)器的不可訪問對(duì)象。它改為將這些對(duì)象的項(xiàng)從終止隊(duì)列中移除并將它們放置在標(biāo)為準(zhǔn)備終止的對(duì)象列表中。該列表中的項(xiàng)指向托管堆中準(zhǔn)備被調(diào)用其終止代碼的對(duì)象。垃圾回收器為此列表中的對(duì)象調(diào)用 Finalize 方法,然后,將這些項(xiàng)從列表中移除。后來的垃圾回收將確定終止的對(duì)象確實(shí)是垃圾,因?yàn)闃?biāo)為準(zhǔn)備終止對(duì)象的列表中的項(xiàng)不再指向它們。在后來的垃圾回收中,實(shí)際上回收了對(duì)象的內(nèi)存。)Dispose方法在不使用終結(jié)器時(shí),可以考慮使用Dispose方法,你可以使用這
6、個(gè)方法來釋放所保存包括的在托管對(duì)象引用在內(nèi)的任何資源。但使用它時(shí)需用GC.SuppressFinalize來告知運(yùn)行時(shí)這些對(duì)象不需要終結(jié)。如下所示:public void Dispose()object.Dispose();dbConnection.Dispose();GC.SuppressFinalize(this); /申明不需要終結(jié)創(chuàng)建并使用了Dispose方法的對(duì)象,就需要使用完該對(duì)象之后調(diào)用這些方法,最好是在Finally中調(diào)用。/以下代碼演示來自MSDN/ Design pattern for the base class./ By implementing IDisposable
7、, you are announcing that instances/ of this type allocate scarce resources.public class BaseResource : IDisposable/ Pointer to an external unmanaged resource.private IntPtr handle;/ Other managed resource this class uses.private Component Components;/ Track whether Dispose has been called.private b
8、ool disposed = false;/ Constructor for the BaseResource object.public BaseResource()/ Insert appropriate constructor code here./ Implement IDisposable./ Do not make this method virtual./ A derived class should not be able to override this method.public void Dispose()Dispose(true);/ Take yourself off
9、 the Finalization queue/ to prevent finalization code for this object/ from executing a second time.GC.SuppressFinalize(this);/ Dispose(bool disposing) executes in two distinct scenarios. / If disposing equals true, the method has been called directly/ or indirectly by a user's code. Managed and
10、 unmanaged resources / can be disposed./ If disposing equals false, the method has been called by the / runtime from inside the finalizer and you should not reference / other objects. Only unmanaged resources can be disposed. protected virtual void Dispose(bool disposing)/ Check to see if Dispose ha
11、s already been called.if (!this.disposed)/ If disposing equals true, dispose all managed/ and unmanaged resources.if (disposing)/ Dispose managed resources.Components.Dispose();/ Release unmanaged resources. If disposing is false,/ only the following code is executed.CloseHandle(handle);handle = Int
12、Ptr.Zero;/ Note that this is not thread safe./ Another thread could start disposing the object/ after the managed resources are disposed,/ but before the disposed flag is set to true./ If thread safety is necessary, it must be/ implemented by the client.disposed = true;/ Use C# destructor syntax for
13、 finalization code./ This destructor will run only if the Dispose method / does not get called./ It gives your base class the opportunity to finalize./ Do not provide destructors in types derived from this class. BaseResource()/ Do not re-create Dispose clean-up code here./ Calling Dispose(false) is
14、 optimal in terms of/ readability and maintainability.Dispose(false);/ Allow your Dispose method to be called multiple times, / but throw an exception if the object has been disposed. / Whenever you do something with this class,/ check to see if it has been disposed.public void DoSomething()if (this
15、.disposed)throw new ObjectDisposedException();/ Design pattern for a derived class./ Note that this derived class inherently implements the/ IDisposable interface because it is implemented in the base class. public class MyResourceWrapper : BaseResource/ A managed resource that you add in this deriv
16、ed class. private ManagedResource addedManaged;/ A native unmanaged resource that you add in this derived class. private NativeResource addedNative;private bool disposed = false;/ Constructor for this object.public MyResourceWrapper()/ Insert appropriate constructor code tected override void
17、 Dispose(bool disposing)if (!this.disposed)tryif (disposing)/ Release the managed resources you added in/ this derived class here.addedManaged.Dispose();/ Release the native unmanaged resources you added/ in this derived class here.CloseHandle(addedNative);this.disposed = true;finally/ Call Dispose
18、on your base class.base.Dispose(disposing);/ This derived class does not have a Finalize method/ or a Dispose method without parameters because it inherits/ them from the base class.System.GC類GC類包含了可使用戶與垃圾回收機(jī)制進(jìn)行互操作的靜態(tài)方法,包括發(fā)起新一輪垃圾回收操作的方法。確定某對(duì)象當(dāng)前所在代的方法及當(dāng)前分配內(nèi)存空間的方法。GC.Collect(); /無參時(shí)將發(fā)起一輪全面的回收。GC.Collect(i);/(0<=i<=2)對(duì)第i代進(jìn)行垃圾回收。GetTotalMemory將返因分配于托管堆上的內(nèi)存空間總量。當(dāng)參數(shù)為True時(shí),在計(jì)算之前將進(jìn)行一輪全面的垃圾回收。如下所示:下面是 在.NET Framewo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《焊接標(biāo)準(zhǔn)》教學(xué)大綱
- 廣西理論知識(shí)和業(yè)務(wù)規(guī)范考題
- 建筑裝飾材料與設(shè)計(jì)教案
- 家教教案(教師版)必修一第三章
- 玉溪師范學(xué)院《社會(huì)政策》2022-2023學(xué)年第一學(xué)期期末試卷
- 玉溪師范學(xué)院《馬克思主義經(jīng)典文獻(xiàn)導(dǎo)讀》2023-2024學(xué)年第一學(xué)期期末試卷
- 冀教版六年級(jí)下冊(cè)英語全冊(cè)教案
- 2下第二單元課件
- 2024年鹽業(yè)項(xiàng)目綜合評(píng)估報(bào)告
- 2023年微電子組件項(xiàng)目綜合評(píng)估報(bào)告
- 2022全國各地中考語文試題匯編:綜合性學(xué)習(xí)
- 2022年西藏開發(fā)投資集團(tuán)有限公司招聘筆試題庫及答案解析
- 抗生素使用十大誤區(qū)課件
- 初三【語文(統(tǒng)編)】《范進(jìn)中舉》中人物丑態(tài)的表現(xiàn)課件
- 物業(yè)管理風(fēng)險(xiǎn)管控
- 電泳-厚-度-檢-測(cè)-記錄
- 治安巡防大隊(duì)績效考評(píng)細(xì)則
- (中職) 電子商務(wù)基礎(chǔ)(第二版)教案
- 滬教版初中語文目錄(六到九年級(jí))
- DB11T 2000-2022 建筑工程消防施工質(zhì)量驗(yàn)收規(guī)范
- 廣告知多少?課件
評(píng)論
0/150
提交評(píng)論