1. <bdo id="8zfej"></bdo>
    <li id="8zfej"><meter id="8zfej"><th id="8zfej"></th></meter></li>

    南京北大青鳥(niǎo)

    全國(guó)咨詢電話:15195455103

    三分鐘了解北大青鳥(niǎo)
    當(dāng)前位置:南京北大青鳥(niǎo) > 學(xué)習(xí)園地 > 編程技巧

    基礎(chǔ)知識(shí):CLR垃圾回收器采用代(generation)機(jī)制,目前支持0、1、2三代。

    來(lái)源:未知? ? ? 作者:wxs ? ??

    基礎(chǔ)知識(shí):CLR垃圾回收器采用代(generation)機(jī)制,目前支持0、1、2三代。 1、新構(gòu)造添加到堆的對(duì)象稱為第0代。 2、經(jīng)過(guò)對(duì)第0代的垃圾回收之后,第0代的幸存者被提升至第1代。 3、經(jīng)過(guò)對(duì)
    基礎(chǔ)知識(shí):CLR垃圾回收器采用代(generation)機(jī)制,目前支持0、1、2三代。
     
    1、新構(gòu)造添加到堆的對(duì)象稱為第0代。
     
    2、經(jīng)過(guò)對(duì)第0代的垃圾回收之后,第0代的幸存者被提升至第1代。
     
    3、經(jīng)過(guò)對(duì)第1代的垃圾回收之后,第一代的幸存者被提升至第2代。
     
    CLR初始化時(shí),會(huì)為每一代選擇預(yù)算。第0代的預(yù)算約為256K,第1代預(yù)算約2M,第2代預(yù)算約10M。在實(shí)際使用過(guò)程中,垃圾回收器會(huì)用類似啟發(fā)式算法調(diào)整各代的預(yù)算。
     
    實(shí)例:該實(shí)例運(yùn)行在.NET4.0環(huán)境
     
    View Code
     
     
    運(yùn)行結(jié)果:
     
     
     
    問(wèn)題提出:
     
    1、為什么table、list、sb都為2代對(duì)象?
     
    程序的開(kāi)始創(chuàng)建了StringBuilder的實(shí)例sb和DataTable的實(shí)例table,由GC.GetGeneration(table)方法可知table和sb這兩個(gè)對(duì)象在剛創(chuàng)建之后屬于第0代。
    當(dāng)通過(guò)for循環(huán)為table添加數(shù)據(jù)時(shí)很快超出了第0代256K內(nèi)存的預(yù)算,這個(gè)時(shí)候CLR會(huì)啟動(dòng)一次垃圾回收,垃圾回收器檢測(cè)內(nèi)存中的sb對(duì)象,發(fā)現(xiàn)sb對(duì)象被后面的Console.WriteLine("SB代數(shù):" + GC.GetGeneration(sb));引用,所以沒(méi)被回收。由于table占有的內(nèi)存迅速增加,并且在經(jīng)過(guò)一次垃圾回收后sb幸存下來(lái),所以此時(shí)sb和table都被提升到1代。0代內(nèi)存空出來(lái)。
    1代的內(nèi)存預(yù)算是2M,從運(yùn)行結(jié)果可以看出終table占有的內(nèi)存為3.5M,也就是說(shuō)table的數(shù)據(jù)增加也會(huì)超出1代內(nèi)存預(yù)算。在1代內(nèi)存預(yù)算快被超出的時(shí)候,CLR啟動(dòng)垃圾回收器,檢查第1代和第0代中的所有對(duì)象。但發(fā)現(xiàn)sb對(duì)象仍然被引用,沒(méi)被回收,所以sb對(duì)象在回收第1代和第0代的回收之后幸存下來(lái),所以sb對(duì)象被提升到第2代。Table對(duì)象由于超過(guò)1代的內(nèi)存預(yù)算,也被提升到第2代。1代內(nèi)存空出來(lái)。
    同理也可以得出list對(duì)象由于超出1代的內(nèi)存預(yù)算被提升到2代。在這個(gè)實(shí)例中如果把list的for循環(huán)調(diào)整到2000000時(shí),會(huì)導(dǎo)致OutOfMemoryException異常。因?yàn)閘ist占用的內(nèi)存迅增加,垃圾回收器執(zhí)行一次完整的回收之后還不能滿足list的需要,所以拋出OutOfMemoryException異常。
      對(duì)象被提升到2代這個(gè)過(guò)程中,會(huì)多次啟動(dòng)垃圾回收器,對(duì)性能有一定的影響,并且由于table和list的數(shù)據(jù)量比較大,同時(shí)也成為大對(duì)象。回收大對(duì)象損失的性能更多。在這個(gè)實(shí)例中,從運(yùn)行結(jié)果可以看出2000條的數(shù)據(jù)量table占用的內(nèi)存比list占用的內(nèi)存多340K,這個(gè)數(shù)量比0代的內(nèi)存預(yù)算還要大。
     
    建議:
     
    1、在項(xiàng)目開(kāi)發(fā)中,如果底層不需要用到DataTable自帶的一些功能(如select(),compute()等方法),而只是用來(lái)數(shù)據(jù)傳輸,個(gè)人建議采用List<T>的方式。因?yàn)樗加玫膬?nèi)存比DataTable小,同時(shí)在list被回收時(shí)性能損失更小。
     
    2、如果對(duì)象有可能為大對(duì)象,可以使用GC.GetTotalMemory(true)方法來(lái)測(cè)定。評(píng)估之后可能會(huì)成為大對(duì)象則建議分割該對(duì)象或者采用非托管方式(可以啟用unsafe)。

    分享到:
    近期文章

    搶試聽(tīng)名額

    名額僅剩66名

    教育改變生活

    WE CHANGE LIVES

    主站蜘蛛池模板: 亚洲七久久之综合七久久| 在线综合亚洲中文精品| 五月综合激情婷婷六月色窝 | 婷婷六月久久综合丁香可观看 | 图图资源网亚洲综合网站| 国产成人无码综合亚洲日韩| 亚洲综合免费视频| segui久久综合精品| 国产香蕉尹人综合在线| 伊人久久亚洲综合影院首页| 色综合久久天天综合| 一本色道久久88加勒比—综合| 亚洲色欲www综合网| 中文自拍日本综合| 2020久久精品亚洲热综合一本| 综合人妻久久一区二区精品| 国产成人综合在线观看网站 | 99久久国产综合精品五月天| 亚洲综合另类小说色区色噜噜| 亚洲综合激情六月婷婷在线观看 | 国内偷自视频区视频综合| 亚洲av日韩av综合| 精品亚洲综合久久中文字幕| 天天综合网天天做天天受| 亚洲五月综合网色九月色| 久久大香线蕉综合爱| 自拍三级综合影视| 激情综合色综合久久综合| 色天天综合色天天看| 97久久天天综合色天天综合色hd| 色婷婷综合久久久中文字幕 | 琪琪五月天综合婷婷| 国产成人综合色视频精品| 成人综合激情另类小说| 色婷婷久久综合中文网站 | 狠狠综合久久久久综合网| 本道久久综合无码中文字幕| 色综合久久98天天综合| 亚洲色婷婷综合开心网| 丁香婷婷色五月激情综合深爱| 久久国产综合精品五月天|