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

    主站蜘蛛池模板: 亚洲综合精品香蕉久久网| 国产精品亚洲综合天堂夜夜| 日本一道综合久久aⅴ免费| 久久婷婷午色综合夜啪| 日韩亚洲人成在线综合| 国产成人亚洲综合无码精品| 六月婷婷国产精品综合| 久久综合丁香激情久久| 色综合天天综合高清网国产 | 中文字幕人成无码人妻综合社区| 色综合99久久久无码国产精品| 久久久久久久尹人综合网亚洲| 久久婷婷是五月综合色狠狠| 九月丁香婷婷亚洲综合色| 亚洲综合精品网站| 制服丝袜人妻综合第一页| 亚洲综合成人网在线观看| 亚洲 自拍 另类小说综合图区| 亚洲国产精品综合久久20| 人人狠狠综合久久亚洲88| 久久婷婷五月综合97色直播| 综合一区自拍亚洲综合图区| 激情伊人五月天久久综合| 亚洲AV综合色区无码二区爱AV| 狠狠色婷婷七月色综合| 婷婷成人丁香五月综合激情| 亚洲中文字幕无码久久综合网| 丁香五月缴情综合网| 99久久婷婷国产综合精品| 99久久国产综合精品五月天| 久久婷婷色香五月综合激情| 人人妻人人狠人人爽天天综合网 | 国产成人综合亚洲一区| 伊人色综合久久天天| 色欲老女人人妻综合网| 一本一道久久综合久久| 国产成人久久综合二区| 丁香五月网久久综合| 亚洲AV综合色一区二区三区| 国产成人综合在线观看网站| 婷婷激情狠狠综合五月|