A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小人渣子 中级黑马   /  2013-10-24 21:23  /  1241 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小人渣子 于 2013-10-25 21:14 编辑

托管资源可以通过垃圾回收释放内存资源,那非托管资源该怎么释放空间?对垃圾回收机制理解的不透彻,跪求大神讲解一下~

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

2 个回复

倒序浏览
三代回收机制

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

  2. namespace GCCollectIntExample
  3. {
  4.     class MyGCCollectClass
  5.     {
  6.         private const long maxGarbage = 1000;

  7.         static void Main()
  8.         {
  9.             MyGCCollectClass myGCCol = new MyGCCollectClass();

  10.             // Determine the maximum number of generations the system
  11.             // garbage collector currently supports.
  12.             Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

  13.             myGCCol.MakeSomeGarbage();

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

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

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

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

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

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

  26.             // Determine which generation myGCCol object is stored in.
  27.             Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
  28.             Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
  29.             Console.Read();
  30.         }

  31.         void MakeSomeGarbage()
  32.         {
  33.             Version vt;

  34.             for (int i = 0; i < maxGarbage; i++)
  35.             {
  36.                 // Create objects and release them to fill up memory
  37.                 // with unused objects.
  38.                 vt = new Version();
  39.             }
  40.         }
  41.     }
  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
一楼的知识受教了。让我也了解了很多关于GC回收机制的原理。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马