.NET中的內(nèi)存管理,GC機制,內(nèi)存釋放過程_圖文_第1頁
.NET中的內(nèi)存管理,GC機制,內(nèi)存釋放過程_圖文_第2頁
.NET中的內(nèi)存管理,GC機制,內(nèi)存釋放過程_圖文_第3頁
.NET中的內(nèi)存管理,GC機制,內(nèi)存釋放過程_圖文_第4頁
.NET中的內(nèi)存管理,GC機制,內(nèi)存釋放過程_圖文_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、 protected virtual void Dispose(bool disposing if (disposing / 托管類 / 非托管資源釋放 Base( this.Dispose(false; public class Derive : Base protected override void Dispose(bool disposing if (disposing / 托管類 / 非托管資源釋放 base.Dispose(disposing; Visual Basic Public Class Base Implements IDisposable Public Overload

2、s Sub Dispose( Implements IDisposable.Dispose Me.Dispose(True GC.SuppressFinalize(Me End Sub Protected Overloads Overridable Sub Dispose(ByVal disposing As Boolean If disposing Then ' 托管類 End If ' 非托管資源釋放 End Sub Protected Overrides Sub Finalize( Me.Dispose(False MyBase.Finalize( End Sub End

3、 Class Public Class Derive Inherits Base Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean If disposing Then ' 托管類 End If ' 非托管資源釋放 MyBase.Dispose(disposing End Sub End Class 為什么要這樣設(shè)計呢?讓我在后面解說一下?,F(xiàn)在我們講講實現(xiàn)這個 Dispose 方法的幾個準(zhǔn) 則: 它不能扔出任何錯誤,重復(fù)的調(diào)用也不能扔出錯誤。也就是說,如果我已經(jīng)調(diào)用了一個對象 的 Dispos

4、e,當(dāng)我第二次調(diào)用 Dispose 的時候程序不應(yīng)該出錯,簡單地說程序在第二次調(diào)用 Dispose 時不會做任何事。這些可以通過一個 flag 或多重 if 判斷實現(xiàn)。 一個對象的 Dispose 要做到釋放這個對象的所有資源。拿一個繼承類為例,繼承類中用到了 非托管資源所以它實現(xiàn)了 IDisposable 接口,如果繼承類的基類也用到了非托管資源那么基 類也得被釋放,基類的資源如何在繼承類中釋放呢?當(dāng)然是通過一個 virtual/Overridable 方 法 了 , 這 樣我 們 能 保證每 個 Dispose 都 被 調(diào)用到 。 這 就 是為 什 么 我們的 設(shè) 計 有 一個 virtu

5、al/Overridable 的 Dispose 方法。注意我們首先要釋放繼承類的資源然后再釋放基類的資 源。 因為非托管資源一定要被保障正確釋放所以我們要定義一個 Finalizer 來避免程序員忘了調(diào) 用 Dispose 的情況。上面的設(shè)計就采用了這種形式。如果我們手動調(diào)用 Dispose 方法就沒有 必要再保留 Finalizer 了,所以在 Dispose 中我們用了 GC.SupressFinalize 將對象從 Finalizer 表 去掉,這樣再回收時速度會更快。 那么那個 disposing 和" 托管類" 是怎么回事呢?是這樣:在 "托管類&qu

6、ot; 中寫所有你想在調(diào)用 Dispose 時讓其處于可釋放狀態(tài)的托管代碼。還記得我們說過我們不知道托管代碼是什么時 候釋放的嗎?在這里我們只是去掉成員對象的引用讓它處于可被回收狀態(tài), 并不是直接釋放 內(nèi)存。在"托管類"中這里我們也要寫上所有實現(xiàn)了 IDisposable 的成員對象,因為他們也有 Dispose,所以也需要在對象的 Dispose 中調(diào)用他們的 Dispose,這樣才能保證第二個準(zhǔn)則。 disposing 是為了區(qū)分 Dispose 的調(diào)用方法,如果我們手動調(diào)用那么為了第二個準(zhǔn)則"托管類" 部分當(dāng)然得執(zhí)行,但如果是 Finalizer

7、調(diào)用的 Dispose,這時候?qū)ο笠呀?jīng)沒有任何引用,也就 是說對象的成員自然也就不存在了(無引用) ,也就沒有必要執(zhí)行"托管類"部分了,因為他 們已經(jīng)處于可被回收狀態(tài)了。好了,這就是 IDisposable 接口的全部了?,F(xiàn)在讓我們來回想 一下,以前我們可能認(rèn)為有了 Dispose 內(nèi)存就會馬上被釋放,這是錯誤的。只有非托管內(nèi)存 才會被馬上釋放,托管內(nèi)存的釋放由 GC 管理,我們不用管。 -弱引用的使用 A = B,我們稱這樣的引用叫做強引用,GC 就是通過檢查強引用來決定一個對象是否是可以 回收的。另外還有一種引用稱作弱引用(WeakReference) ,這種引用不影響

8、 GC 回收,這就 是它的用處所在。你會問到底有什么用處。現(xiàn)在我們來假設(shè)我們有一個很胖的對象,也就是 說它占用很多內(nèi)存。我們用過了這個對象,打算將它的引用去掉好讓 GC 可以回收內(nèi)存,但 是功夫不大我們又需要這個對象了,沒辦法,重新創(chuàng)建實例,怎么創(chuàng)建這么慢???有什么辦 法解決這樣的問題?有, 將對象留在內(nèi)存中不就快了嘛! 不過我們不想這樣胖得對象總占著 內(nèi)存,而我們也不想總是創(chuàng)建這樣胖的新實例,因為這樣很耗時。那怎么辦?聰明的朋 友一定已經(jīng)猜到了我要說解決方法是弱引用。不錯,就是它。我們可以創(chuàng)建一個這個胖對象 的弱引用,這樣在內(nèi)存不夠時 GC 可以回收,不影響內(nèi)存使用,而在沒有被 GC 回收前

9、我們 還可以再次利用該對象。這里有一個示例: C# public class Fat public int Data; public Fat(int data this.Data = data; public class Main public static void Main( Fat oFat = new Fat(1; WeakReference oFatRef = new WeakReference(oFat; / 從這里開始,F(xiàn)at 對象可以被回收了。 oFat = null; if (oFatRef.IsAlive Console.WriteLine(Fat oFatRef.Targ

10、et.Data; / 1 / 強制回收。 GC.Collect(; Console.WriteLine(oFatRef.IsAlive; / False Console.ReadLine(; Visual Basic Public Class Fat Public Data As Integer Public Sub New(ByVal data As Integer Me.Data = data End Sub End Class Public Module Main Sub Main( Dim oFat As New Fat(1 Dim oFatRef As New WeakReference(oFat ' 從這里開始,F(xiàn)at 對象可以被回收了。 oFat = Nothing If oFatRef.IsAlive Then Console.Write

溫馨提示

  • 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

提交評論