.NET垃圾回收笔记

  名词

    垃圾收集目标

  •       ephemeral GC

        发生在Gen 0 和Gen 1 的垃圾收集

  •       Full GC

        发生Gen 2 及以上的Gen与LOH的垃圾收集

    垃圾收集模式

  •       工作站模式

        GC直接发生在内存分配的线程(也是当前的工作托管线程)上

  •       服务器模式

        每个CPU核都有一个自己独立的GC线程与托管堆

    垃圾收集的并发需求

  •       并发的意思是background GC在进行垃圾收集时,其它托管线程是否可以同时工作(包括分配内存)
  •       仅需为Full GC考虑并发,因为ephemeral GC的时间短、代价小,可一直为阻塞模式。
  •       .NET4后的并发可让background GC与ephemeral GC同时工作

  配置

    

<configuration>

    <runtime>

        <gcConcurrent enabled="true"/>

        <gcServer enabled="true"/>

    </runtime>

</configuration>

   继承与垃圾回收模型

using System;





namespace 继承与垃圾回收模型 {

    class Base : IDisposable {

        private bool _disposed;



        protected virtual void Dispose(bool disposing) {

            Console.WriteLine(string.Format("Base.Dispose({0})", disposing));

            if (!_disposed) {

                if (disposing) {

                    #region 清理Base自己的托管资源

                    #endregion

                }

                #region 清理Base自己的非托管资源

                #endregion

            }

            _disposed = true;

        }



        public void Base干活() {

            if (_disposed) {

                throw new ObjectDisposedException("Base");

            }

        }



        ~Base() {

            Console.WriteLine("~Base()");

            Dispose(false);

        }



        public void Dispose() {

            Console.WriteLine("");

            Dispose(true);

            GC.SuppressFinalize(this);

        }

    }





    class Child : Base {

        private bool _disposed;



        protected override void Dispose(bool disposing) {

            Console.WriteLine(string.Format("Child.Dispose({0})", disposing));

            if (!_disposed) {

                try {

                    if (disposing) {

                        #region 清理Child自己的托管资源

                        #endregion

                    }

                    #region 清理Child自己的非托管资源

                    #endregion

                    _disposed = true;

                }

                finally {

                    base.Dispose(disposing);

                }

            }

        }



        public void Child干活() {

            if (_disposed) {

                throw new ObjectDisposedException("爸爸");

            }

        }



        //“可以”为Child写析构方法,但没必要。内部的“Dispose(false)”也没必要

        ~Child() {

            Console.WriteLine("~Child()");

        }

    }



    class 回收示例 {

        /// <summary>

        /// 输出:

        /// -----以下为手动回收

        /// Child.Dispose(True)

        /// Base.Dispose(True)

        ///

        /// -----以下为自动回收

        /// ~Child()

        /// ~Base()

        /// Child.Dispose(False)

        /// Base.Dispose(False)

        /// </summary>

        /// <param name="args"></param>

        static void Main(string[] args) {

            Console.WriteLine("-----以下为手动回收");

            var 手动 = new Child();

            手动.Dispose();



            Console.WriteLine("/n/n-----以下为自动回收");

            var 自动 = new Child();

            GC.Collect();

        }

    }

}

  

 

  资料

    实现 Dispose 方法

    垃圾回收通知

    .Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇) 发布在新年第一秒

    .Net Discovery 系列之四--深入理解.Net垃圾收集机制(下)

    So, what’s new in the CLR 4.0 GC?      
    .NET 4/4.5里新的垃圾收集机制      
    对象代(Generation)与GC      
    Using GC Efficiently – Part 2      
    CLR探索系列:Server and Workstation Garbage Collection探索(垃圾回收系列)
      

你可能感兴趣的:(.net)