当前位置:  编程技术>.net/c#/asp.net

C#垃圾回收机制的详细介绍

    来源: 互联网  发布时间:2014-10-23

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

一、托管代码/非托管代码
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();
        }
    }

结果:

    
 
 

您可能感兴趣的文章:

  • 浅谈关于C#的垃圾回收机制
  • Python类的构造函数,析构函数以及垃圾回收机制详细介绍及代码举例
  • “当某个实例不再被任何对象引用时就会被垃圾回收机制回收”,那么怎样才算是不被任何对象引用呢?
  • 急!垃圾回收的问题!
  • 垃圾回收器 bdw-gc
  • 关于垃圾回收的问题
  • 垃圾回收的問題
  • 垃圾回收器:gc()的细节,请讨论
  • php垃圾回收机制解析
  • scjp的垃圾回收几个小东东
  • 我时用jdbc打开数据库,使用后是否要显示的关闭数据库,还是等java的垃圾回收器来处理。
  • 我的机器崩溃拉!no stack trace available怎么解决??强制垃圾回收也不行!
  • 关于构造器和垃圾回收器
  • 垃圾回收日志文件分析工具 GCViewer
  • 基于java中stack与heap的区别,java中的垃圾回收机制的相关介绍
  • SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它
  • php析构函数与垃圾回收机制
  • Python的垃圾回收机制深入分析
  • 深入java垃圾回收的详解
  • Java中垃圾回收器GC对吞吐量的影响测试
  • 详谈.net中的垃圾回收机制
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • CCNIC-垃圾-垃圾-垃圾
  • 用Linux发的邮件被当成垃圾邮件
  • ubuntu垃圾清理
  • 邮件反病毒和反垃圾网关 SAGATOR
  • 反垃圾邮件系统 SpamAssassin
  • 防垃圾留言插件 Akismet
  • WordPress反垃圾插件 Defensio Anti-Spam
  • 发垃圾邮件系统 SpamCheck
  • 垃圾收集器 bdwgc
  • WordPress防垃圾留言插件 SpamBam
  • 垃圾信息过滤插件 stop-spam
  • 反垃圾留言插件 WP-Ban
  • linux会产生垃圾文件吗?
  • WP的反垃圾插件 WangGuard
  • 怎么用javamail彻底删除邮件。不是放到垃圾箱里。。
  • 反垃圾邮件系统 milter manager
  • 反垃圾邮件系统 Rspamd
  • WordPress防垃圾留言插件 DNS-anti-spam
  • 垃圾邮件过滤 phPOP3clean
  • WordPress防垃圾留言插件 WP-Gatekeeper


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3