国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#垃圾回收機制的詳細介紹

2020-01-24 03:08:24
字體:
來源:轉載
供稿:網友

一、托管代碼/非托管代碼
C#代碼通過C#編譯器編譯成程序集,程序集由微軟中間語言組成,CLR會為程序集開辟一個應用程序域,程序集就是運行在這個應用程序域里面的,應用程序域是相互獨立的,互不影響。
托管代碼:被CLR管理的代碼。
非托管代碼:不被CLR管理的代碼。
分配在棧空間的變量,一旦執行完成其所在的作用域(即大括號范圍)就會被CLR回收。
分配在堆里面的對象,當沒有任何變量引用它的時候,這個對象就被標記為“垃圾對象”(沒有變量引用它),等待垃圾回收器回收。
Eg:

復制代碼 代碼如下:

Person p=new Person();
p=null;//p這時候沒有指向任何對象空間,此時為“垃圾對象”。

二、GC
GC會定時清理堆里面的垃圾對象,GC的清理頻率程序員無法決定,CLR會自動控制。當一個對象標記為垃圾的時候,這個對象不一定會被立即回收。
三、析構函數
1、不能有訪問修飾符,不能有參數。
2、在對象被垃圾回收器回收的時候,析構函數被GC自動調用。
3、執行一些清理善后的操作的時候。
復制代碼 代碼如下:

class Person
{
  ~Person()
 {
    Console.WrilteLine("我是析構函數");
 }
}

四、代
當堆里面的對象有1W個的時候,GC是不是循環1W次來判斷是否為“垃圾對象”,然后對其進行回收呢?答案是否定的,微軟根據實際需要采用了很多種算法來清理堆里面的垃圾對象,其中很重要的一種算法就是“代”。堆里面總共有3代,譬如,當程序運行時,有對象需要存儲在堆里面,GC就會創建第1代(假設空間大小為256K),對象就會存儲在第0代里面,當程序繼續運行,運行到第0代的大小不足以存放對象,這時候就就會創建第1代(假設空間為10M),GC就會把第0代里面的“垃圾對象”清理掉,把“活著”的對象放在第1代,這時候第0代就空了,用于存放新來的對象,當第0代滿了的時候,就會繼續執行以上操作,隨著程序的運行,第1代不能滿足存放要求,這時候就會創建第2代,清理方式如上相同。下圖用于理解以上描述的過程:

GC.GetGeneration(P)得到指定的對象對應的代,總共有三代。
GC.Collect();//讓垃圾回收器對所有的代進行回收。

GC.Collect(1)//回收第0代和第1代回收。

復制代碼 代碼如下:

class Program
    {
        ~Program()
        {
            Console.WriteLine("我是析構函數");
        }
        static void Main(string[] args)
        {
            Program p1 = new Program();
            Console.WriteLine("p對象所在的代:" + GC.GetGeneration(p1));//處在第0代
            GC.Collect();//所有代清除了,包括第0代,這時候存活的對象就存在在第1代了。
            Console.WriteLine("p對象所在的代:" + GC.GetGeneration(p1));
            GC.Collect();//所有代清除了,包括第0代第1代,這時候存活的對象就存在在第2代了。
            Console.WriteLine("p對象所在的代:" + GC.GetGeneration(p1));
            GC.Collect();//最多只有3代
            Console.WriteLine("p對象所在的代:" + GC.GetGeneration(p1));
            p1 = null;//p這時候在第2代了         
            GC.Collect(2);//這時候p1就被回收掉了。
            Console.ReadKey();
        }
    }

結果:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 翼城县| 河南省| 凤台县| 安庆市| 东阳市| 涿州市| 贵阳市| 体育| 开封市| 荥经县| 银川市| 通榆县| 耒阳市| 扎赉特旗| 大埔县| 美姑县| 滁州市| 景谷| 海口市| 公主岭市| 六安市| 元朗区| 嫩江县| 华容县| 六枝特区| 东乌珠穆沁旗| 和平县| 嘉祥县| 紫金县| 桐庐县| 葵青区| 临沭县| 河北省| 泸州市| 石台县| 锦屏县| 霸州市| 北京市| 桃园县| 长治县| 桃园县|