|
轉(zhuǎn)眼間《.NET Discovery》系列文章已經(jīng)推出1年了,本文為該系列的第10-13篇文章,在本文中將對(duì)以前所講的.NET平臺(tái)知識(shí)做一個(gè)小小的總結(jié)與機(jī)制分析,引出并重點(diǎn)介紹這些機(jī)制對(duì)程序性能的影響與改進(jìn)建議。
本文將分為四部分,分別講述了:垃圾回收機(jī)制、即時(shí)編譯機(jī)制、異常處理機(jī)制、字符串駐駐留機(jī)制的原理與性能改進(jìn)建議。
《.NET Discovery》系列的每篇文章撰寫耗時(shí)都在2天以上,轉(zhuǎn)載時(shí)麻煩著名作者Aicken(李鳴),并且未經(jīng)作者同意,禁止一切商業(yè)用途!
一.關(guān)于垃圾回收機(jī)制●
機(jī)制分析垃圾收集器是.NET平臺(tái)的一個(gè)特性,它自動(dòng)回收托管堆上不再使用的對(duì)象,及時(shí)清理內(nèi)存,這一切都是對(duì)開發(fā)人員透明的,當(dāng)然你也可以手動(dòng)把它召喚出來,它的本質(zhì)就是跟蹤所有被引用到的對(duì)象,整理對(duì)象不再被引用的對(duì)象,回收相應(yīng)的內(nèi)存。垃圾收集機(jī)制采用標(biāo)記與清除(Mark Sweep)算法來完成上述任務(wù),整個(gè)過程分為兩步:
Step 1.Mark-Sweep :從應(yīng)用程序的root出發(fā),利用相互引用關(guān)系,遍歷其在Heap上動(dòng)態(tài)分配的所有對(duì)象,指明需要回收的對(duì)象,標(biāo)記出那些存活的對(duì)象,予以標(biāo)記。
Step 2.Compact: 對(duì)內(nèi)存中存活的對(duì)象進(jìn)行移動(dòng),修改它們的指針,使之在內(nèi)存中連續(xù),這樣空閑的內(nèi)存也就連續(xù)了,即完成了內(nèi)存釋放工作,也解決了內(nèi)存碎片問題,這個(gè)過程也可以成為指針的壓縮。垃圾收集器一般將托管堆中的對(duì)象分為3代,這可以通過調(diào)用GC.MaxGeneration得知,對(duì)象按照存在時(shí)間長(zhǎng)短進(jìn)行分代,最短的分在第0代,最長(zhǎng)的分在第2代,第2代中的對(duì)象往往是比較大的,第二代空間被稱作Large Object Heap,對(duì)于2代對(duì)象的回收,與第0、1代回收方式相比最大的不同在于,沒有了指針移動(dòng)的壓縮過程。如下圖,第一次GC時(shí),左邊第一列A-F表示內(nèi)存中的對(duì)象,位于淺藍(lán)色 區(qū)域,經(jīng)過Mark后,ACDF標(biāo)記為可用,Sweep過程清除了BE,Compact過程移動(dòng)了ACDF,使之位于連續(xù)存儲(chǔ)區(qū)域中;第二次使用綠色做標(biāo)記;第三次GC使用藍(lán)色表示標(biāo)記;可以看出第三次GC過程沒有了指針移動(dòng)的壓縮過程。

NET技術(shù):.Net Discovery系列-深入理解平臺(tái)機(jī)制與性能影響(上),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。