C#垃圾回收機制

轉自:http://www.cnblogs.com/ArmyShen/archive/2012/08/27/2657928.htmlhtml

1:垃圾回收機制函數

CLR託管堆:this

(1)第0代--預算容量256kspa

(2)第1代--預算容量2Mcode

(3)第2代--預算容量10Mhtm

注:在不一樣的程序中,託管堆上的實際內存管理對象的容量可能不會按照預算容量大小開闢對象

當第0代對象充滿的時候,會自動進行垃圾回收,這時第0代中未被釋放的對象成爲了第1代,而新建立的對象變成第0代,以此類推,當第0代再次充滿的 時候會繼續執行垃圾回收,未被釋放的對象會被添加到第1代,隨着程序的執行,第1代對象中也會產生垃圾,此時垃圾回收器並不會當即執行回收操做,而是等第 1代被充滿變成第2代時被回收並整理內存。blog

 

2:Finalize析構函數被調用的條件:繼承

(1)第0代對象充滿接口

(2)顯示調用System.GC的Collect方法

(3)Windows內存不足

(4)應用程序被關閉

(5)CLR被關閉

 

3:釋放模式

複製代碼
using System; //要實現釋放模式,必須繼承IDisposable public class MyClass:IDisposable { private bool disposed = false; private void Dispose(bool disposeing) { if (!this.disposed) { if (disposeing) { Console.WriteLine("調用引用對象的Dispose方法"); } Console.WriteLine("釋放類自己非託管資源"); disposed = true; if (disposeing) { GC.SuppressFinalize(this);//禁止終結器的調用  } } } //重寫IDisposable中的Dispose方法 public void Dispose() { Dispose(true); } //和上面的方法沒區別 public void Close() { Dispose(true); } ~MyClass() { Dispose(false); } } public class Test { static void Main() { //using這個語法的使用,在實現IDisposable接口時才能使用 using (MyClass mc = new MyClass()) { Console.WriteLine("調用mc作些事情"); } //MyClass mc = new MyClass(); //try //{ // Console.WriteLine("調用mc作些事情"); //} //finally //{ // mc.Dispose(); //}  } }
複製代碼
相關文章
相關標籤/搜索