GC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ilipan/article/details/46044339

GC是一个抽象类,控制系统的垃圾回收器(自动回收会未使用的内存服务)。

GC.MaxGeneration:获取系统当前支持的最大代数。最大值为2。


代的由来?

       微软总结了一些过去的开发中出现的现象,其中有一条就是,越是新的对象,越是最快被丢弃不再使用。

       微软根据这个经验在内存回收中引入了Generation的概念,此处暂时将其翻译成代。

代的使用规则?

       托管堆开始的时候是空的,程序启动开始在其中分配对象,这时候的对象就是第0代(Generation 0)对象。

       当托管堆栈内存空间不足,GC会进行一次回收,剩下的没有被回收的对象会升级一代,这时候的对象就是

       第1代(Generation 1)对象。如在分配对象,对象就是第0代(Generation 0)对象。如GC再次进行来及回收,

       剩下的没有被回收的第1代(Generation 1)对象会升级到第2代(Generation 2)对象,剩下的没有被回收的

       第0代(Generation 0)对象会升级到第1代(Generation 1)对象。升级到第2代就不会再升级了

什么时候GC回收第一,第二代呢?

       GC回收完第0代后,发现内存空间还不够,就会回收第一代,回收完第一代,还不够,就回收第二代。

GC的一些方法的介绍:

           GC.GetTotalMemory( bool forceFullCollection ); 

                         参数:

                        true表示该方法先做垃圾收集操作,之后才计算出受控代码分配的字节数。

                        false表示不做垃圾,收集直接计算出受控代码分配的字节数。

                        返回值:

                        一个数字,托管内存中当前所分配字节数的可用的最佳近似值。

            GC.Collect();    //强制对所有代进行即时垃圾回收。

            GC.Collect(int generation)    //强制对 0 代到指定代进行即时垃圾回收。


CSDN 的代码:

using System;

namespace GCCollectIntExample
{
    class MyGCCollectClass
    {
        private const long maxGarbage = 1000;
        static void Main()
        {
            MyGCCollectClass myGCCol = new MyGCCollectClass();
            // Determine the maximum number of generations the system
            // garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

            myGCCol.MakeSomeGarbage();

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            // Determine the best available approximation of the number 
            // of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of generation 0 only.
            GC.Collect(0);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of all generations up to and including 2.
            GC.Collect(2);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            Console.Read();
        }
        void MakeSomeGarbage()
        {
            Version vt;

            for (int i = 0; i < maxGarbage; i++)
            {
                // Create objects and release them to fill up memory
                // with unused objects.
                vt = new Version();
            }
        }
    }
}










阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页