.Net之美读书笔记17

.Net垃圾回收

垃圾回收:指的是CLR对托管堆的垃圾内存进行回收,由CLR自动处理,这里简单说下垃圾回收的机制。

引用类型的内存分布

我们知道引用对象分配在托管堆上,我们新建一个Person对象来分析下新建的过程。

  1. 声明一个Person类型变量(在栈stack上分配一变量)
  2. new 在托管堆heap上创建对象实例
  3. 将对象实例地址赋值给栈stack的变量
    1236909-20171228155312803-1265912578.png
    public class Person:IDisposable
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public DateTime Birthday { get; set; }

        public virtual void Study()
        {
            Console.WriteLine("I am a person.I must study!");
        }

        public void Dispose()
        {
            Console.WriteLine("Running Dispose");
        }

        ~Person()
        {
            Console.WriteLine("Running Destructor");
        }
    }
        static void Main(string[] args)
        {

            Person p1;
            p1 = new Person();
            Console.ReadKey();
        }

回收的垃圾

有了引用对象的理解,我们在理解要回收的垃圾是什么?

  • 要回收的垃圾:栈上不存在变量指向的托管堆对象,在进行垃圾回收时回收
  • 什么时候发生垃圾回收: 当托管堆(Heap)的空间不足时或应用程序关闭时
  • 怎样回收: 将垃圾对象托管堆内存收回,并将非垃圾对象内存压缩(避免内存碎片化)

    析构函数与IDisposable模式

    上面所说的垃圾回收都是发生在托管堆Heap上的,那么非托管资源怎么回收呀?抱歉这个这个只有自己代码回收(像C++那样)。这种情况一般出现在引用的类库对象中涉及非托管资源(如:数据库处理对象SqlConnection或流处理对象Stream),其实类库也给提供了具体的回收方法,在回收时调用。

    析构函数

    析构函数就是为处理垃圾回收时对非托管资源的释放问题?GC在进行垃圾回收时,如果实例存在析构函数,会先执行析构函数然后再垃圾回收。
    Person p1;
    p1 = new Person();
    Console.ReadKey();
    p1 = null;
    //代码强制GC垃圾回收
    //会执行Person 的析构函数
    GC.Collect();

IDisposable模式

有时对象使用完,就需要将所关联资源文件释放掉,这里引出了IDisposable模式 ,实现IDisposable接口

    //会调用对象的Dispose()方法释放资源
    using (Person p = new Person())
            {
                p.Study();
            }

转载于:https://www.cnblogs.com/LoveTomato/p/8136127.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值