c#中垃圾回收機制的原理是什么

這篇文章給大家介紹c#中垃圾回收機制的原理是什么,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的崇州網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

寫了一個window服務(wù),循環(huán)更新sqlite記錄,內(nèi)存一點點穩(wěn)步增長。三天后,內(nèi)存溢出。于是,我從自己的代碼入手,查找到底哪兒占用內(nèi)存釋放不掉,最終明確是調(diào)用servicestack.ormlite更新sqlite數(shù)據(jù)庫造成的。至于是不是框架問題,可能性不大,因為本地模擬執(zhí)行的代碼沒有任何問題。我覺得應(yīng)該是orm在執(zhí)行數(shù)據(jù)庫更新后,對象還在被引用造成的。這里,我貼出一個偽代碼:

c#中垃圾回收機制的原理是什么

我的猜測到底對不對呢?現(xiàn)在還不知道。不過在探尋答案的時候,對GC的相關(guān)機制詳細地了解了一遍。

c#中垃圾回收機制的原理是什么

                                                  圖片來源《.NET高級調(diào)試》pdf

CLR加載時,就會分配堆。

 三、GC的工作機制

 GC有三個假設(shè):

1、如果沒有特別聲明,所有的對象都是垃圾(通過引用追蹤對象是否為垃圾)

2、假設(shè)托管堆上所有的對象的活躍時間都是短暫的(相對于長久活躍的對象來說,GC將更頻繁地收集短暫活躍的對象)

3、通過代跟蹤對象的持續(xù)時間

以下是官方文檔給出的和這三個假設(shè)一致

The garbage collector in the common language runtime supports object aging using generations

Objects created more recently are part of newer generations, and have lower generation numbers than objects created earlier in the application life cycle. 

Objects in the most recent generation are in generation 0. This implementation of the garbage collector supports three generations of objects, generations 0, 1, and 2

每代都有自己的堆,假如0代的堆滿了,就會觸發(fā)GC,然后把依然有引用的對象升級,放到1代對象。最后壓縮堆,把剩余的堆空間合并到一塊。1代對象也是如此操作。但到了2代,就處理不同了。2代的堆可能是大對象堆,它的壓縮代價過于高昂,所以只是合并相鄰的空間。

c#中垃圾回收機制的原理是什么

                                                    圖片來源博客園c#技術(shù)漫談之垃圾回收(GC)

Garbage collection happens automatically when a request for memory cannot be satisfied using available free memory

 GC發(fā)生的時機,就是相應(yīng)的堆達到了閾值,因為堆也有大小限制,并不是無限的。盡管2代堆或者大對象堆滿的時候,通過增加新的內(nèi)存段來滿足內(nèi)存分配,如果沒有可用的內(nèi)存,這時就會報內(nèi)存溢出。

四、GC不能釋放非托管資源

有兩種情況,第一種:托管代碼引用了非托管資源,比如文件操作、數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接等。這時候必須手動釋放,或?qū)崿F(xiàn) dispose模式,或?qū)崿F(xiàn)對象終結(jié)

When a type uses unmanaged resources that must be released before instances of the type are reclaimed, the type can implement a finalizer.

In most cases, finalizers are implemented by overriding the Object.Finalize method; however, types written in C# or C++ implement destructors, which compilers turn into an override of Object.Finalize 

必須注意的一點是,實現(xiàn)對象終結(jié)器,GC會在釋放對象之前自動調(diào)用。其實這是一個代價非常高昂的備用機制。所以能自己釋放非托管資源的,就自己釋放。

如果一個對象中包含有終結(jié)器,那么在new的時候放入到終結(jié)者隊列。當(dāng)GC會把這個對象標(biāo)為垃圾時,放入到另一個隊列F-Reachable中。這個隊列包含了所有帶有終結(jié)器并且將被作為垃圾收集的對象,這些對象的終結(jié)器都將被執(zhí)行。在垃圾收集的過程總并不會執(zhí)行終結(jié)器代碼。而是由.NET 進程的終結(jié)線程調(diào)用。因此,此時的垃圾回收滯后一段時間,目的在于等待終結(jié)器代碼執(zhí)行的完成。

五、dispose模式

c#中垃圾回收機制的原理是什么

關(guān)于c#中垃圾回收機制的原理是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

當(dāng)前文章:c#中垃圾回收機制的原理是什么
當(dāng)前地址:http://muchs.cn/article30/ihcgpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、網(wǎng)站制作微信公眾號、建站公司、移動網(wǎng)站建設(shè)、定制開發(fā)

廣告

聲明:本網(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)

營銷型網(wǎng)站建設(shè)