1.如果你釋放的是托管托管代碼的內(nèi)存,那么托管代碼的內(nèi)存管理是自動的,.NET可以保證我們的托管程序在結(jié)束時全部釋放。
在新疆等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計、成都做網(wǎng)站 網(wǎng)站設(shè)計制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,新疆網(wǎng)站建設(shè)費用合理。
2.如果是非托管資源時.NET就不能自動管理了,下面是釋放非托管資源內(nèi)存方法
當(dāng)我們利用如數(shù)據(jù)庫、文件等非托管資源時,就要用到.NET Framework中的標(biāo)準(zhǔn): IDisposable接口。按照標(biāo)準(zhǔn),所有有需要手動釋放非托管資源的類都得實現(xiàn)此接口。這個接口只有一個方法,Dispose(),不過有相對的 Guidelines指示如何實現(xiàn)此接口,在這里我向大家說一說。實現(xiàn)IDisposable這個接口的類需要有這樣的結(jié)構(gòu):
[Visual Basic]
Public Class Base
Implements IDisposable
Public Overloads 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 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
我們要實現(xiàn)Dispose方法,實現(xiàn)這個Dispose方法的幾個準(zhǔn)則:
它不能扔出任何錯誤,重復(fù)的調(diào)用也不能扔出錯誤。也就是說,如果我已經(jīng)調(diào)用了一個對象的Dispose,當(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è)計有一個virtual/Overridable的Dispose方法。注意我們首先要釋放繼承類的資源然后再釋放基類的資源。
因為非托管資源一定要被保障正確釋放所以我們要定義一個Finalizer來避免程序員忘了調(diào)用Dispose的情況。上面的設(shè)計就采用了這種形式。如果我們手動調(diào)用Dispose方法就沒有必要再保留Finalizer了,所以在Dispose中我們用了GC.SupressFinalize 將對象從Finalizer表去掉,這樣再回收時速度會更快。
那么那個disposing和"托管類"是怎么回事呢?是這樣:在"托管類"中寫所有你想在調(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調(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管理,我們不用管。
一般.net的垃圾回收機(jī)制會在過程結(jié)束后進(jìn)行垃圾回收,但是垃圾回收是比較消耗系統(tǒng)資源的,所以不可能經(jīng)常被調(diào)用。
如果你需要強(qiáng)制進(jìn)行垃圾回收,可在過程最后添加如下代碼:
GC.Collect()
強(qiáng)制進(jìn)行垃圾回收
.NET目前的垃圾回收機(jī)制不能實現(xiàn)把對象真正的立即釋放掉,GC會對垃圾進(jìn)行管理,如果垃圾沒有引用計數(shù)了,就會被回收。
編碼的時候能用托管類盡量用托管類去實現(xiàn)你的功能,
對于實現(xiàn)了IDisposable接口的類,用完了記得調(diào)用close或者Dispose又或者相應(yīng)的方法去釋放資源,最好吧使用using語句塊;
對于Com對象,用完了先關(guān)閉,然后調(diào)用Runtime.InteropServices.Marshal.FinalReleaseComObject()方法把Com對象的引用計數(shù)設(shè)置為0。當(dāng) COM 對象的引用計數(shù)變?yōu)?0 時,通常會釋放 COM 對象,不過這取決于 COM
對象的實現(xiàn),而不是運行時可以控制的。最后調(diào)用ComObj = Nothing以釋放ComObj持有的引用。不過要注意,只有當(dāng)ComObj的生存期相對于垃圾回收器用于檢測孤立對象的時間來說很長時,你才應(yīng)該將變量設(shè)置為 Nothing。
有部分來自MSDN
可以將文件等分成兩部分,分別用兩個private讀取就是2線程。
內(nèi)存解決方案:不要等程序自動GC,自己手動釋放不需要內(nèi)存。
缺陷:可能會浪費時間。
如果一個程序要用Application.exit來退出,那說明太失敗了。。。
一般來說,都是用close關(guān)閉就可以了。
用.NET平臺開發(fā),只要你在操作數(shù)據(jù)庫或者IO的時候沒有忘記關(guān)閉資源連接,一般是不需要你手動釋放的。
1、可能進(jìn)入了死循環(huán),仔細(xì)檢查代碼有無這種情況。
2、無用的數(shù)據(jù)一直在累積而沒有及時銷毀,導(dǎo)致內(nèi)存占用越來越大,最終崩潰。要注意對象隨用隨清,及時 Dispose 掉或調(diào)用 GC.Collect。
當(dāng)前文章:vb.netgc的簡單介紹
文章來源:http://m.rwnh.cn/article38/phjspp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、品牌網(wǎng)站設(shè)計、用戶體驗、定制網(wǎng)站、響應(yīng)式網(wǎng)站、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)