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

    主站蜘蛛池模板: 伊人色综合九久久天天蜜桃| 久久婷婷香蕉热狠狠综合| 久久婷婷国产综合精品| 18和谐综合色区| 丁香五月亚洲综合深深爱| 久久久综合九色合综国产精品 | 狠狠综合久久综合88亚洲| 久久一区二区精品综合| 加勒比色综合久久久久久久久| 国产综合精品久久亚洲 | 久久婷婷丁香五月综合五| 亚洲熟女综合一区二区三区| 久久久久久久综合日本| 色婷婷久久综合中文久久蜜桃| 香蕉国产综合久久猫咪| 热综合一本伊人久久精品 | 色综合久久精品中文字幕首页| 一本色道久久鬼综合88| 青青草原综合久久大伊人精品| 色之综合天天综合色天天棕色| 一本一道久久综合狠狠老| 伊人婷婷色香五月综合缴激情 | 久久久久综合网久久| 亚洲综合在线另类色区奇米| 亚洲AV成人潮喷综合网| HEYZO无码综合国产精品| 亚洲国产婷婷综合在线精品| 丁香五月网久久综合| 一本一本久久a久久精品综合 | 久久综合给合久久狠狠狠97色| 亚州欧州一本综合天堂网| 色综合久久久久综合体桃花网| 亚洲AV综合色一区二区三区| 狠狠狠色丁香婷婷综合久久俺| 日韩欧国产精品一区综合无码| 亚洲综合色一区二区三区小说| 亚洲欧美日韩综合久久久| 天天综合天天综合色在线| 久久综合亚洲色HEZYO国产| 国产成人综合美国十次| 一本久道综合色婷婷五月|