撕开奶罩揉吮奶头玩大胸直播,亚洲色无码专线精品观看,太平公主秘史在线观看免费,国产精品久久毛片

南京北大青鳥(niǎo)

全國(guó)咨詢(xún)電話: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ì)象稱(chēng)為第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ì)象稱(chēng)為第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ì)用類(lèi)似啟發(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