• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#垃圾回收机制详解

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、托管代码/非托管代码

C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,应用程序域是相互独立的,互不影响。

托管代码:被CLR管理的代码。

非托管代码:不被CLR管理的代码。

分配在栈空间的变量,一旦执行完成其所在的作用域(即大括号范围)就会被CLR回收。

分配在堆里面的对象,当没有任何变量引用它的时候,这个对象就被标记为“垃圾对象”(没有变量引用它),等待垃圾回收器回收。

Eg:

1 Person p=new Person();
2 
3 p=null;//p这时候没有指向任何对象空间,此时为“垃圾对象”。

二、GC

GC会定时清理堆里面的垃圾对象,GC的清理频率程序员无法决定,CLR会自动控制。当一个对象标记为垃圾的时候,这个对象不一定会被立即回收。

三、析构函数

1、不能有访问修饰符,不能有参数。

2、在对象被垃圾回收器回收的时候,析构函数被GC自动调用。

3、执行一些清理善后的操作的时候。

 1 class Person
 2 
 3 {
 4 
 5   ~Person()
 6 
 7  {
 8 
 9     Console.WrilteLine("我是析构函数");
10 
11  }
12 
13 }

四、代

当堆里面的对象有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();
        }
    }

结果:

 

注:以上文章均属软谋原创,如需转载请注明出处!

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#TaskContinueWith发布时间:2022-07-13
下一篇:
c#邮箱发送和接收发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap