zoukankan      html  css  js  c++  java
  • GC的三代回收机制

    三代回收机制

    为了提升垃圾回收的效率,微软做了很多的优化。一个很重要的功能就是三代回收机制。对于这个机制,GC做了一下几个假设:

    • 越新的对象,生存周期会越短
    • 越老的对象,生存周期会越长
    • 新创建的对象,和其它对象关联性强越强,他被访问的频率越高
    • 移动内存的一部分要比移动整个托管堆要快

    当然,很多学者都认为这些假设在大多数情况下是正确的,因此我们下面来讨论一下这些假设怎样影响GC的。

    当GC初始化的时候,托管堆没有任何对象。加到托管堆中的对象被认为是0代(Generation 0),你可以看到Figure2。0代的对象都是新的对象,并且没有被GC检查过的对象。

    当GC执行回收的时候,所有没有被回收的对象会集中在堆栈的最底端。这些对象幸存了下来,是比较老的对象,因此被认为是1代(Generation 1)。Figure3

    当更多的对象被创建的时候,这些新创建的对象被放在堆栈的顶端,作为0代。当GC被再次执行的时候,1代中幸存下来的对象变成了2代,0代幸存下来的变成1代。Figure4。这时候0代为空,新创建的对象为0代。

    现在,2代是GC支持的最高代了,GC再次运行的时候,2代里面幸存的对象仍然是2代。

     下面的代码是MSDN上的GC的demo

    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();
                }
            }
        }
    }
    

      运行结果

  • 相关阅读:
    Python冒泡排序(4)
    Python冒泡排序(3)
    Python3默认递归最大深度是998
    Python利用递归函数和列表推导式实现快速排序
    天池比赛的文章--欢迎大家交流
    caffe学习笔记1
    网络压缩系列1:低秩逼近
    yolov1
    Windows下用Caffe跑自己的数据(遥感影像)
    基于灰度共生矩阵的纹理提取
  • 原文地址:https://www.cnblogs.com/myprogram/p/2843586.html
Copyright © 2011-2022 走看看