亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

.Net垃圾收集機制—了解算法與代齡

2019-11-17 02:45:01
字體:
來源:轉載
供稿:網友
.Net垃圾收集機制—了解算法與代齡

垃圾收集器在本質上就是負責跟蹤所有對象被引用到的地方,關注對象不再被引用的情況,回收相應的內存。在.NET平臺中同樣如此,有效的提高.NET垃圾回收性能,能夠提高程序執行效率。

  其實垃圾收集并不是伴隨java出現的,早在1958年,圖林獎得主John發明的Lisp語言就已經提供了GC的功能,這是GC的第一次出現,是思想的一次閃光!而后,1984年Dave Ungar發明的Small talk語言第一次正式采用了GC機制。.Net的垃圾回收機制是個很大的話題,如果你沒接觸過類似C++那樣的語言,就很難理解GC是一個多么重要、令人興奮的東西:

  1.提高軟件系統的內聚。

  2.降低編程復雜度,使程序員不必分散精力去處理析構。

  3.不妨礙設計師進行系統抽象。

  4.減少由于內存運用不當產生的Bug。

  5.成功的將內存管理工作從程序的編寫時,脫離至運行時,使不可預估的管理漏洞變為可預估的。

  1.算法

  垃圾收集器的本質,就是跟蹤所有被引用到的對象,整理對象不再被引用的對象,回收相應的內存。這聽起來類似于一種叫做“引用計數(Reference Counting)”的算法,然而這種算法需要遍歷所有對象,并維護它們的引用情況,所以效率較低些,并且在出現“環引用”時很容易造成內存泄露。所以.Net中采用了一種叫做“標記與清除(Mark Sweep)”算法來完成上述任務。“標記與清除”算法,顧名思義,這種算法有兩個本領:

  “標記”本領——垃圾的識別:從應用程序的root出發,利用相互引用關系,遍歷其在Heap上動態分配的所有對象,沒有被引用的對象不被標記,即成為垃圾;存活的對象被標記,即維護成了一張“根-對象可達圖”。其實,CLR會把對象關系看做“樹圖”,無疑,了解數據結構的同學都知道,有了“樹圖”的概念,會加快遍歷對象的速度。   檢測、標記對象引用,是一件很有意思的事情,有很多方法可以做到,但是只有一種是效率最優的,.Net中是利用棧來完成的,在不斷的入棧與出棧中完成檢測:先在樹圖中選擇一個需要檢測的對象,將該對象的所有引用壓棧,如此反復直到棧變空為止。棧變空意味著已經遍歷了這個局部根(或者說是樹圖中的節點)能夠到達的所有對象。樹圖節點范圍包括局部變量(實際上局部變量會很快被回收,因為它的作用域很明顯、很好控制)、寄存器、靜態變量,這些元素都要重復這個操作。一旦完成,便逐個對象地檢查內存,沒有標記的對象變成了垃圾。

  “清除”本領——回收內存:啟用Compact算法,對內存中存活的對象進行移動,修改它們的指針,使之在內存中連續,這樣空閑的內存也就連續了,這就解決了內存碎片問題,當再次為新對象分配內存時,CLR不必在充滿碎片的內存中尋找適合新對象的內存空間,所以分配速度會大大提高。

  但是大對象(large object heap)除外,GC不會移動一個內存中巨無霸,因為它知道現在的CPU不便宜。通常,大對象具有很長的生存期,當一個大對象在.NET托管堆中產生時,它被分配在堆的一個特殊部分中,移動大對象所帶來的開銷超過了整理這部分堆所能提高的性能。

  Compact算法除了會提高再次分配內存的速度,如果新分配的對象在堆中位置很緊湊的話,高速緩存的性能將會得到提高,因為一起分配的對象經常被一起使用(程序的局部性原理),所以為程序提供一段連續空白的內存空間是很重要的。

  2.代齡(Generation)  

 代齡就是對Heap中的對象按照存在時間長短進行分代,最短的分在第0代,最長的分在第2代,第2代中的對象往往是比較大的。Generation的層級與FrameWork版本有關,可以通過調用GC.MaxGeneration得知。   通常,GC會優先收集那些最近分配的對象(第0代),這與操作系統經典內存換頁算法“最近最少使用”算法如出一轍。但是,這并不代表GC只收集最近分配的對象,通常,.Net GC將堆空間按對象的生存期長短分成3代:新分配的對象在第0代(0代空間最大長度通常為256K),按地址順序分配,它們通常是一些局部變量;第1代(1代空間最大長度通常為2 MB)是經過0代垃圾收集后仍然駐留在內存中的對象,它們通常是一些如表單,按鈕等對象;第2代是經歷過幾次垃圾收集后仍然駐留在內存中的對象,它們通常是一些應用程序對象。

  當內存吃緊時(例如0代對象充滿),GC便被調入執行引擎--也就是CLR--開始對第0代的空間進行標記與壓縮工作、回收工作,這通常小于1毫秒。如果回收后內存依然吃緊,那么GC會繼續回收第1代(回收操作通常小于10毫秒)、第2代,當然GC有時并不是按照第0、1、2代的順序收集垃圾的,這取決于運行時的情況,或是手動調用GC.Collect(i)指定回收的代。當對第2代回收后任然無法獲得足夠的內存,那么系統就會拋出OutOfMemoryException異常,當經過幾次GC過后,0代中的某個對象仍然存在,那么它將被移動到第1代。同理,第1、2代也按同樣的邏輯運行。   這里還要說的是,GC Heap中代的數量與容量,都是可變的(這由一個“策略引擎”控制,在第二節中,會介紹到“策略引擎”), 以下代碼結合Windbg可以說明這個問題,以下代碼中,可以通過單擊按鈕“button1”,不斷的分配內存,而后獲得對象“a”的代齡情況,并且在Form加載時也會獲得“a”的代齡。   1.public partial class Form

1 : Form

  2.{

  3. PRivate string a = new string(a,1);

  4. public Form1()

  5. {

  6. InitializeComponent();

  7. }

  8. private void button1_Click(object sender, EventArgs e)

  9. {

  10. a = new string(a, 900000);

  11. label1.Text = GC.GetGeneration(a).ToString();

  12. }

  13. private void Form1_Load(object sender, EventArgs e)

  14. {

  15. label1.Text = GC.GetGeneration(a).ToString();

  16. }

  17.}

  程序剛加載時,“a”的代齡為第0代,通過windbg我們還獲得了以下信息:

  可以看出,GC堆被分成了兩個段,三代,每代起始地址十進制差值為12,點擊數次“button1”按鈕后,“a”的代齡升為第2代,通過windbg我們又獲得了以下信息:

  這里要注意一個很關鍵的地方,就是各代的起始(generation x starts at)十進制地址差值不再是12,0代與1代差為98904,1代與2代差為107908,這說明代的大小隨程序運行在改變,并且GC heap的大小也有變化。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲亚洲在线视频| 中文字幕亚洲自拍| 色狠狠av一区二区三区香蕉蜜桃| 欧美激情视频给我| 亚洲欧美日韩一区二区在线| 亚洲网在线观看| 日韩麻豆第一页| 91香蕉嫩草影院入口| 久久久久久久久中文字幕| 亚洲国产精品久久久久秋霞不卡| 中文字幕精品—区二区| 欧美视频一区二区三区…| 欧美激情第一页xxx| 成人免费黄色网| 国产在线观看一区二区三区| 91亚洲人电影| 国产精品久久久久久久久久ktv| 国产欧美日韩中文字幕在线| 亚洲精品91美女久久久久久久| 狠狠色香婷婷久久亚洲精品| 国产日本欧美一区二区三区在线| 国产精品成人一区二区三区吃奶| 亚洲色图25p| 国产成人aa精品一区在线播放| 日本精品一区二区三区在线播放视频| 国产精品成人免费视频| 亚洲在线免费看| 国产精品成人免费电影| 久久成人18免费网站| 欧美国产极速在线| 欧美日韩激情视频8区| 中国china体内裑精亚洲片| 日韩在线免费av| 久久91精品国产91久久跳| 高清欧美性猛交xxxx| 中文字幕国产精品| 欧美多人爱爱视频网站| 国产精品视频一| 成人免费网站在线看| 欧美亚洲视频在线观看| 国产精品专区h在线观看| 国产一区二区在线免费视频| 久久久国产一区二区| 成人中心免费视频| 国产成人精品av在线| 久久亚洲精品中文字幕冲田杏梨| 欧美激情精品久久久久久变态| 136fldh精品导航福利| 欧美综合在线观看| 国产精品免费一区豆花| 久久夜精品va视频免费观看| 欧美男插女视频| 日韩av最新在线| 欧美中文在线观看国产| 日韩av在线天堂网| 精品国产一区二区三区久久| 在线观看欧美视频| 91人人爽人人爽人人精88v| 日韩一区二区精品视频| 亚洲自拍高清视频网站| 国产日韩欧美电影在线观看| 亚洲国语精品自产拍在线观看| 久久国产精品久久久久久久久久| 国产97在线|亚洲| 国产男女猛烈无遮挡91| 欧美日韩国产成人在线| 国产精品偷伦视频免费观看国产| 国产亚洲精品久久久久久| 97成人在线视频| 91久久国产婷婷一区二区| 国产极品精品在线观看| 91在线视频九色| 亚洲欧洲一区二区三区在线观看| 欧美日韩中文在线| 国产欧美精品va在线观看| 欧美性一区二区三区| 日韩精品高清在线| 日韩激情第一页| 日本成人激情视频| 久久精品成人欧美大片| 久久久久国产精品免费| 色婷婷综合久久久久中文字幕1| 欧美日韩亚洲高清| 国产极品精品在线观看| 久久久久久久久国产精品| 亚洲视频电影图片偷拍一区| 91九色单男在线观看| 色婷婷成人综合| 日韩电视剧免费观看网站| 亚洲色图欧美制服丝袜另类第一页| 欧美丰满少妇xxxx| 欧美午夜美女看片| 日韩电影在线观看中文字幕| 国产精品网站入口| 国产主播在线一区| 国产成人精品久久二区二区91| 欧美激情精品久久久久久蜜臀| 亚洲综合av影视| 欧美性做爰毛片| 红桃视频成人在线观看| 疯狂欧美牲乱大交777| 欧美高清视频在线播放| 午夜精品一区二区三区av| 国产亚洲欧美视频| 日韩免费黄色av| 欧美视频在线观看 亚洲欧| 国产精品专区第二| 2019中文字幕在线观看| 精品美女永久免费视频| 奇米影视亚洲狠狠色| 国产福利成人在线| 国内揄拍国内精品| 日本精品视频在线观看| 亚洲美女又黄又爽在线观看| 国产精品久久久| 久久在线视频在线| 日韩**中文字幕毛片| 亚洲国产精品久久久久秋霞不卡| 伊人久久久久久久久久久久久| 亚洲少妇激情视频| 国产精品视频精品| 久久男人av资源网站| 欧美日韩福利在线观看| 久久久亚洲福利精品午夜| 日韩精品免费在线视频观看| 欧美一区第一页| 这里只有精品久久| 97视频在线观看免费高清完整版在线观看| 亚洲国产精品嫩草影院久久| 国产精品亚洲欧美导航| 国产91ⅴ在线精品免费观看| 国产视频综合在线| 国产精品91在线观看| 97国产在线观看| 国产精品久久久久影院日本| 最近2019中文字幕mv免费看| 午夜美女久久久久爽久久| 久久在线观看视频| 国a精品视频大全| 亚洲乱码av中文一区二区| 国产日韩精品在线播放| 成人黄色免费网站在线观看| 91精品久久久久久久久| 亚洲成人av片| 久久久精品久久久久| 91人成网站www| 91精品国产91久久久久福利| 国产精品美女视频网站| 亚洲一级黄色片| 668精品在线视频| 第一福利永久视频精品| 国产精品美女主播在线观看纯欲| 国内精品在线一区| 亚洲免费电影一区| 国产一区在线播放| 韩日精品中文字幕| 91色视频在线观看| 精品欧美一区二区三区| 国产男人精品视频| 欧美在线不卡区| 久久久久久久色| 久久成人18免费网站| 亚洲美女激情视频| 成人春色激情网|