溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

對(duì).NET垃圾回收機(jī)制的初略理解

發(fā)布時(shí)間:2020-07-05 05:30:01 來(lái)源:網(wǎng)絡(luò) 閱讀:392 作者:yrgw 欄目:編程語(yǔ)言

程序員首先是人,不是所有人都是細(xì)心的,更何況細(xì)心的人也會(huì)有粗心的時(shí)候,因此經(jīng)常會(huì)出現(xiàn)忘了釋放已經(jīng)使用完的資源,導(dǎo)致資源緊張。有時(shí)候是不愿去做這些掃尾的事情,因?yàn)橛X(jué)得他的時(shí)間應(yīng)該是用在更偉大更崇高的事業(yè)上面,至于清理垃圾這些雞毛蒜皮的事實(shí)在不值得他一屑。于是就有了垃圾回收機(jī)制,既減輕了程序員的負(fù)擔(dān),也避免了資源的泄漏,一舉兩得。

首先了解一下對(duì)象的整個(gè)生命過(guò)程: 

 1.給對(duì)象分配內(nèi)存;

 2.調(diào)用對(duì)象構(gòu)造器進(jìn)行初始化;

 3.使用資源通過(guò)訪問(wèn)對(duì)象成員;

 4.銷毀對(duì)象;主要是通過(guò)Finalization,Dispose和Close方法

 5.釋放內(nèi)存。

  垃圾回收會(huì)在第1步和第5步發(fā)生。在第5步進(jìn)行垃圾回收比較好理解,第1步是如何觸發(fā)垃圾回收的呢?第1步包含三個(gè)過(guò)程:首先根據(jù)類型成員所需空間總合,然后加上兩個(gè)額外開(kāi)銷:類型指針(type object pointer)和同步模塊索引(sync block index),32位系統(tǒng)下一般是8bytes,64位則是16bytes,最后就是判斷當(dāng)前托管堆中是否有足夠的空間去分配這個(gè)對(duì)象。當(dāng)滿足時(shí)就為對(duì)象分配所需要的內(nèi)存,如果不滿足就會(huì)觸發(fā)垃圾回收,如果垃圾回收后依然不滿足則拋出內(nèi)存不足的異常。另外分配內(nèi)存是連續(xù)分配的,而且在同一時(shí)間段里分配內(nèi)存的那些對(duì)象一般都有很強(qiáng)的聯(lián)系,比如FileStream和BinaryWriter,連續(xù)分配就會(huì)使訪問(wèn)命中率提高,使得性能優(yōu)化。

  關(guān)鍵的問(wèn)題在于垃圾回收器如何知道哪些對(duì)象是垃圾,哪些對(duì)象是依然在使用的呢?在CLR中,將那些不再被引用的對(duì)象被認(rèn)為是可以被回收的。但對(duì)象之間有時(shí)候會(huì)存在復(fù)雜的調(diào)用關(guān)系,這個(gè)時(shí)候就需要尋根溯源,找到源頭后,將這一系列的對(duì)象都標(biāo)示為正在使用的,直到遍歷完所有的源頭,那些沒(méi)被標(biāo)示的就可以被認(rèn)為是垃圾被回收掉。那么源頭是什么呢?在CLR中有個(gè)根(root)的概念,每個(gè)應(yīng)用程序都有一系列的根,根是一個(gè)存儲(chǔ)位置,它保存著一個(gè)指向引用類型對(duì)象的指針。因此局部變量,全局變量,靜態(tài)變量,方法參數(shù)以及指向托管堆中對(duì)象的CPU寄存器都是根。顯然值類型變量是不會(huì)為根的。在標(biāo)記和回收之后還有一個(gè)過(guò)程,夯實(shí)(compact)。 垃圾回收器掃描托管堆,找到連續(xù)的內(nèi)存塊,然后移動(dòng)未回收的對(duì)象到更低的地址, 以得到整塊的內(nèi)存,同時(shí)所有的對(duì)象引用都將被調(diào)整為指向?qū)ο笮碌拇鎯?chǔ)位置。

  CLR垃圾回收機(jī)制中還有個(gè)很重要的概念,代(generation)。其主要目的是提高垃圾回收的性能。一般分為3代:0代,1代和2代。0代是新建對(duì)象和從未經(jīng)過(guò)垃圾回收對(duì)象的集合,1代則是在0代回收過(guò)程中未被回收的對(duì)象集合,2代是最后一代,也就是經(jīng)歷至少兩次回收風(fēng)暴后依然堅(jiān)挺的對(duì)象的集合


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI