程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#學習筆記之垃圾回收機制

C#學習筆記之垃圾回收機制

編輯:C#入門知識

垃圾回收器的基本假定:
1:一個對象越新,那麼這個對象的生命周期就越短。也就是說最近分配內存空間的對象最有可能被釋放。
2:一個對象越老,那麼這個對象的生命周期就越長。也就是說經過幾輪垃圾回收後,對象仍然存在,搜索它時就需要進行大量的工作,卻只能釋放很小的一部分空間。所以有可能還沒有搜索到這個對象的時候,我們已經獲得了需要的內存了。
3:新對象之間通常更可能和新對象之間存在引用關系,也就是說同時被分配內存的對象通常是同時使用,將它們彼此相連有助於提高緩存性能和回收效率。
4:壓縮堆得一部分要比壓縮整個堆要快。
C#中的回收器是分代的垃圾回收器(Generational Garbage Collector),它將分配的對象分為3個類別或代。(可用GC.GetGeneration方法返回任意作為參數的對象當前所處的代)。最近被分配內存的對象被放置於第0代,因為第0代很小,小到足以放進處理器的二級緩存,所以它能夠提供對對象的快速存取。經過一輪垃圾回收後,仍然保留的第0代的對象被移進第1代中,再經過一輪垃圾內存回收後,仍然保留在第1代的對象則被移進第2代中,第2代中保安了生存期較長的對象。
    在C#中值類型是在堆中分配內存,它們有自身的生命周期,所以不用對它們進行管理,會自動分配和釋放。而引用類型是在堆中分配內存的,所以它的分配和釋放就需要像回收機制來管理。C#為一個對象分配內存時,托管堆可以立即返回新對象所需的內存,因為托管堆類似於簡單的字節數組,有一個指向第一個可用內存空間的指針,指針像游標一樣向後移動,一段段內存就分配給正在運行的程序的對象,在不需要太多垃圾回收的小程序,托管堆性能優於傳統的堆。
    當第0代沒有可以分配的有效內存時,就出發了第0代中的一輪垃圾回收,它講刪除那些不再被引用的對象,並將當前正在使用的對象移至第1代。而當第0代垃圾回收後依然不能請求到充足的內存時,就啟動第1代垃圾回收。如果對各代都進行了垃圾回收後仍沒有可用的內存,就會引發一個OutOfMemoryException異常。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved