博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GC的三代回收机制
阅读量:5165 次
发布时间:2019-06-13

本文共 2378 字,大约阅读时间需要 7 分钟。

三代回收机制

为了提升垃圾回收的效率,微软做了很多的优化。一个很重要的功能就是三代回收机制。对于这个机制,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();            }        }    }}

  运行结果

转载于:https://www.cnblogs.com/myprogram/archive/2013/01/04/2843586.html

你可能感兴趣的文章
使用JMeter代理录制app测试脚本
查看>>
MVC 未启用角色管理功能
查看>>
Linq to Object实现分页获取数据
查看>>
mac常用系统命令
查看>>
第42章:MongoDB-集群--Sharding(分片)--单机的搭建
查看>>
异步执行js脚本——防止阻塞
查看>>
利用Excel导出sql语句
查看>>
android上传文件到服务器
查看>>
我回答了90%的面试题,为什么还被拒?
查看>>
Html - Table 表头固定和 tbody 设置 height 在IE不起作用的解决
查看>>
iOS SVN终端指令
查看>>
Linux如何更新软件源
查看>>
NYOJ-289 苹果 又是一个典型的01背包和上题一样没啥好说的
查看>>
HDU 2262 回溯算法 递归枚举
查看>>
九度0J 1374 所有员工年龄排序
查看>>
listview初始化后仍为空
查看>>
无刷新分页
查看>>
SIFT算法
查看>>
git各种撤销操作
查看>>
每天努力一点之SQL
查看>>