天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

.NET Discovery 系列之七--深入理解.NET垃圾收集機(jī)制(拾貝篇)

系列文章導(dǎo)航:

.NET Discovery 系列之一--string從入門(mén)到精通(上)

.NET Discovery 系列之二--string從入門(mén)到精通(勘誤版下)

.NET Discovery 系列之三--深入理解.NET垃圾收集機(jī)制(上)

.NET Discovery 系列之四--深入理解.NET垃圾收集機(jī)制(下)

.NET Discovery 系列之五--Me JIT(上)

.NET Discovery 系列之六--Me JIT(下)

.NET Discovery 系列之七--深入理解.NET垃圾收集機(jī)制(拾貝篇)


  關(guān)于.NET垃圾收集器(Garbage Collection),Aicken已經(jīng)在“.NET Discovery 系列”文章中有2篇的涉及,這一篇文章是對(duì)上2篇文章的補(bǔ)充,關(guān)于“.NET Discovery 系列”文章索引請(qǐng)見(jiàn)本文結(jié)尾。

  第一節(jié).垃圾回收算法與完整收集(Full GC)

  垃圾收集器就是跟蹤所有被引用到的對(duì)象,整理對(duì)象不再被引用的對(duì)象,回收相應(yīng)的內(nèi)存,它使用“標(biāo)記與清除”算法,分兩步回收對(duì)象:

  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)存碎片問(wèn)題,這個(gè)過(guò)程也可以成為指針的壓縮。

  垃圾收集器一般將托管堆中的對(duì)象分為3代,這可以通過(guò)調(diào)用GC.MaxGeneration得知,對(duì)象按照存在時(shí)間長(zhǎng)短進(jìn)行分代,最短的分在第0代,最長(zhǎng)的分在第2代,第2代中的對(duì)象往往是比較大的,第二代空間被稱作Large Object Heap,對(duì)于2代對(duì)象的回收,與第0、1代回收方式相比最大的不同在于,沒(méi)有了指針移動(dòng)的壓縮過(guò)程。

      

圖1 對(duì)象的回收

  如上圖所示,左邊的區(qū)域?yàn)榈谝淮蜧C時(shí)的結(jié)構(gòu),需要注意的是GC標(biāo)記的是那些存活的對(duì)象,而不是需要回收的,所以第一次回收,對(duì)象B、D沒(méi)有被標(biāo)記,所以被回收了,之后GC移動(dòng)了對(duì)象內(nèi)存指針,使空間連續(xù)。

  接下來(lái)看中間的部分,第二次GC開(kāi)始了,C對(duì)象沒(méi)有被標(biāo)記,所以被回收了,接下來(lái)A、D、F三個(gè)對(duì)象被壓縮,形成連續(xù)的內(nèi)存空間,并且形成了第1、2、3代區(qū)域。

  接下來(lái)看最右邊的部分,D對(duì)象沒(méi)有被標(biāo)記,由于D對(duì)象處于第2代中,所以回收D對(duì)象后,GC沒(méi)有啟動(dòng)壓縮步驟,因?yàn)閷?duì)于大對(duì)象的指針移動(dòng),資源耗費(fèi)成本很高。

  對(duì)于第2代的GC稱為Full GC,新分配的對(duì)象在第0代(0代空間最大長(zhǎng)度通常為256K),按地址順序分配,它們通常是一些局部變量;第1代(1代空間最大長(zhǎng)度通常為2 MB)是經(jīng)過(guò)0代垃圾收集后仍然駐留在內(nèi)存中的對(duì)象,它們通常是一些如表單,按鈕等對(duì)象;第2代是經(jīng)歷過(guò)幾次垃圾收集后仍然駐留在內(nèi)存中的對(duì)象,它們通常是一些應(yīng)用程序?qū)ο蟆?/p>

  可見(jiàn)一次Full GC需要的資源是最多的,可能是幾秒或十幾秒。

  托管堆的內(nèi)存分配以段(Segment)為單位,CLR啟動(dòng)時(shí)通常為GC Heap創(chuàng)建2個(gè)段,分別用來(lái)存儲(chǔ)第0、1代對(duì)象和第2代對(duì)象,以下是通過(guò)Windbg工具查看到的GC Heap情況:

圖2 WinDbg 查看GC Heap情況

  可以看出,GC堆被分成了兩個(gè)段,三代,每代起始地址十進(jìn)制差值為12。

  在理解方面需要注意的是,GC回收的是程序中的引用類型,值類型是保存在堆棧之中,當(dāng)值類型對(duì)象出了作用域后會(huì)自動(dòng)釋放內(nèi)存----即彈棧,不需要垃圾收集器管理。

  第二節(jié).GC的工作模式

  GC的工作模式分3種,Workstation GC with Concurrent GC off、 Workstation GC with Concurrent GC on、Server GC ,在.NET 2.0以上版本可以通過(guò)修改Config文件來(lái)改變GC工作模式,例如啟用Server GC:

<configuration> 
<runtime>
<gcServer enabled="true" />
</runtime>
</configuration>

NET技術(shù).NET Discovery 系列之七--深入理解.NET垃圾收集機(jī)制(拾貝篇),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日韩精品a在线视频 | 久久AV喷吹AV高潮欧美 | 恋夜影视列表免费安卓手机版 | 出租屋交换人妻 全文 | 狠狠色狠狠色狠狠五月ady | 暖暖的视频完整视频免费韩国 | 末班车动漫无删减免费 | 国产精品免费久久久久影院 | rio 快播| 后入内射国产一区二区 | 91免费网站在线看入口黄 | 88福利视频 | 插骚妇好爽好骚 | 国产亚洲精品视频亚洲香蕉视 | 97亚洲狠狠色综合久久位 | 我年轻漂亮的继坶2中字在线播放 | 欧美自拍亚洲综合图区 | 久久99这里只有精品 | 日韩 亚洲 欧美 中文 高清 | 伊人精品影院一本到综合 | 99热在线精品免费全部my | 免费国产久久拍久久爱 | 老板吻我下身好爽到高潮 | 少妇久久久久久被弄高潮 | 亚洲国产精品久久又爽黄A片 | 99久久精品久久久久久清纯 | 日本大片免a费观看视频 | 白丝制服被啪到喷水很黄很暴力 | 尤蜜网站在线进入免费 | 丝袜美女被啪啪不带套漫画 | 最新高清无码专区在线视频 | 亚洲福利网站 | 黑人猛挺进小莹的体内视频 | 亚洲 自拍 偷拍 另类综合图区 | 97人视频国产在线观看 | 爆操大胸美女 | 榴莲黄版无限刷 | 噼里啪啦免费观看视频大全 | 熟女强奷系列中文字幕 | 黄A无码片内射无码视频 | 在线播放免费人成视频 |