国产精品毛片一区二区,欧美熟妇brazzers,丰满女邻居的嫩苞张开视频,天天爽夜夜爽夜夜爽

南京北大青鳥

全國咨詢電話:15195455103

三分鐘了解北大青鳥
當前位置:南京北大青鳥 > 學習園地 > 編程技巧

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

來源:未知? ? ? 作者:wxs ? ??

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

分享到:

相關(guān)閱讀:

近期文章

搶試聽名額

名額僅剩66名

教育改變生活

WE CHANGE LIVES