程序員首先是人,不是所有人都是細(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),也避免了資源的泄漏,一舉兩得。
公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出石城免費(fèi)做網(wǎng)站回饋大家。
首先了解一下對(duì)象的整個(gè)生命過(guò)程:
1.給對(duì)象分配內(nèi)存;
2.調(diào)用對(duì)象構(gòu)造器進(jìn)行初始化;
3.使用資源通過(guò)訪(fǎng)問(wèn)對(duì)象成員;
4.銷(xiāo)毀對(duì)象;主要是通過(guò)Finalization,Dispose和Close方法
5.釋放內(nèi)存。
垃圾回收會(huì)在第1步和第5步發(fā)生。在第5步進(jìn)行垃圾回收比較好理解,第1步是如何觸發(fā)垃圾回收的呢?第1步包含三個(gè)過(guò)程:首先根據(jù)類(lèi)型成員所需空間總合,然后加上兩個(gè)額外開(kāi)銷(xiāo):類(lèi)型指針(type object pointer)和同步模塊索引(sync block index),32位系統(tǒng)下一般是8bytes,64位則是16bytes,最后就是判斷當(dāng)前托管堆中是否有足夠的空間去分配這個(gè)對(duì)象。當(dāng)滿(mǎn)足時(shí)就為對(duì)象分配所需要的內(nèi)存,如果不滿(mǎn)足就會(huì)觸發(fā)垃圾回收,如果垃圾回收后依然不滿(mǎn)足則拋出內(nèi)存不足的異常。另外分配內(nèi)存是連續(xù)分配的,而且在同一時(shí)間段里分配內(nèi)存的那些對(duì)象一般都有很強(qiáng)的聯(lián)系,比如FileStream和BinaryWriter,連續(xù)分配就會(huì)使訪(fǎng)問(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è)指向引用類(lèi)型對(duì)象的指針。因此局部變量,全局變量,靜態(tài)變量,方法參數(shù)以及指向托管堆中對(duì)象的CPU寄存器都是根。顯然值類(lèi)型變量是不會(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ì)象的集合