Dotnet程序的內(nèi)存與垃圾回收
都知道程序運(yùn)行時的變量是放在內(nèi)存里的,從我們學(xué)c++ 就知道有析構(gòu)函數(shù) malloc,還有學(xué)c#的時候天天 什么垃圾回收 GC 像背八股文樣的 ,但是這個內(nèi)存究竟能分配多少 沒有人想過吧 ,不論做什么對未知的事充滿好奇永遠(yuǎn)是前進(jìn)發(fā)展的源泉,GC 怎樣才能體現(xiàn)GC的運(yùn)作 今天我們就來實驗下吧。
首先初級的知識還是啰嗦一下:
構(gòu)造函數(shù)負(fù)責(zé)按照模板在內(nèi)存中實例化對象,當(dāng)然你類的這些附加變量都是放在一起的,那么理所當(dāng)然的我們就定義一個超大的數(shù)組來測試他。然后對應(yīng)的~ClassName(){} 函數(shù)則在示例被銷毀的時候執(zhí)行 也就是垃圾回收的時候。于是乎有了下面這段代碼:
1 public class Class3 2 { 3 public string Name { get; set; } 4 public int[] ar = null; 5 public Class3(string _name) 6 { 7 Name = _name; 8 9 ar = new int[20000000]; 10 Console.WriteLine("my name is :" + Name); 11 } 12 13 14 15 ~Class3() 16 { 17 Console.WriteLine("GC working:" + Name); 18 } 19 }
按照我們正常人的理解,以及以往C++的經(jīng)驗。你一個方法執(zhí)行 執(zhí)行完畢 所有花括號內(nèi)的自動變量都會被銷毀。但是new出來的東西確不一樣屬于malloc空間的 放在堆上 ,如果沒有hold住地址就不能進(jìn)行有效內(nèi)存控制 進(jìn)而就成了野指針 內(nèi)存泄露。但是 我說但是 按照我們一個神經(jīng)正常的人理解 你要自動化的處理這個事情 你會怎么做?你對象new完 放那 總要有一個東西在運(yùn)行時就像一絲線一樣一直把他掛著掛著的 ,沒有東西把他掛著可不就代表這對象沒用了么。我們建一個winform程序,按鈕事件里先寫段代碼:
1 Random rdm = new Random(); 2 Class3 c1 =new Class3(rdm.Next().ToString()); 3 4 c1 = null; 5 GC.Collect();


網(wǎng)上說這里做了c1=null后 立即就會觸發(fā)回收,純屬是扯淡,這個完全是未知的, 但是調(diào)用GC.Collect()呢基本上呢確實至多第二次就會觸發(fā)回收。但是如果我沒把GC.Collect()去掉呢讓其發(fā)展呢,這就要看心情了,有時候很久都不會有什么動作c1=null這句要不要都一樣。根據(jù)數(shù)組大小我這邊的運(yùn)行情況基本上存儲4組大概76M就會進(jìn)行回收。如果有引用把對象掛著呢,當(dāng)然 就不會進(jìn)行回收,那么最大可以存多少呢?我這邊特意把配置設(shè)為32位的情況下大概1.14Gb的時候就會溢出。


1 int cliCount = 0; 2 List<Class3> clist = new List<Class3>(); 3 4 private void button1_Click(object sender, EventArgs e) 5 { 6 Random rdm = new Random(); 7 8 Class3 c3 = new Class3(rdm.Next().ToString()); 9 cliCount++; 10 Console.WriteLine("count:"+cliCount.ToString() ); 11 clist.Add(c3); 12 }

如果是x64則上不封頂,注意 內(nèi)存的增長體現(xiàn)在紅框處,滿了后會自動繼續(xù)擴(kuò),會超出實際物理內(nèi)存。由于Windows系統(tǒng)是虛擬內(nèi)存機(jī)制,內(nèi)部進(jìn)行了一些玄妙的處理咱也不了解。不管咋樣對應(yīng)程序來說當(dāng)成正常區(qū)域訪問。

通過上面的測試可以驗證垃圾回收的機(jī)制基本上還是按照我們常規(guī)理解的套路去運(yùn)作的的。 C++ 的時候要很謹(jǐn)慎 一層一層的 調(diào)用了new 一定別忘了delete 然后析構(gòu)函數(shù)里也是一樣。C#里把好多內(nèi)存分配相關(guān)的弱化了 感覺析構(gòu)函數(shù)差不多成擺設(shè)了。

浙公網(wǎng)安備 33010602011771號