.net框架读书笔记---CLR内存管理\垃圾收集(七)

深入理解编程控制垃圾收集器
本文详细介绍了如何使用System.GC类型直接控制垃圾收集器,包括查询最大代龄、执行垃圾收集、等待终止化队列完成以及处理大尺寸对象。通过示例代码,展示了如何在不同代龄下执行垃圾收集,确保内存资源的有效管理和回收。

编程控制垃圾收集器

  System.GC类型为应用程序提供了直接控制垃圾收集器的一些方法,可以通过GC.MaxGeneration来查询托管堆支持的最大代龄,目前为2。

  通过下面方法气质执行垃圾收集器

  •  GC.Collect(int);传递代龄,传递0,收集0代,传递1,收集0,1代,传递2,收集0.1.2;
  •  GC.Collect();无参强制对所有代龄的对象执行垃圾收集;

  GC。WaitForPendingFinalizers方法会挂起调用线程,直到处理终止化队列的线程清空了该队列,并完成每个对象的Finalize方法调用为止。下面代码:

  GC.Collect();

  GC.WaitForPendingFinalizers();

  GC.Collect();

  上面代码首先强制执行一次垃圾收集。当第一轮垃圾收集完成后,不需要终止化的那些对象内存将被回收。但是终止化对象的内存还没有被回收。在第一次Collect调用返回后,一个特殊的、专门用于终止化的线程将采用异步的方式来调用所有终止化对象的Finalize方法。WaitForPendingFinalizers方法将使应用程序处于睡眠状态,直到所有的Finalize方法调用完成为止。当WaitForPendingFinalizers方法返回,所有的终止化对象将成为真正的可收集垃圾。这时第二次Collect调用将强制执行第二轮垃圾收集,所有终止化对象的内存将在这一轮垃圾收集中完全被回收。

  通过编程继续了解垃圾收集:

  

ContractedBlock.gifExpandedBlockStart.gif代码
namespace ControlGC
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"Maximum generations: "+GC.MaxGeneration);

//在托管堆上创建一个新的GenObj对象

Object o
= new GenObj();

//刚刚创建,代龄为0
Console.WriteLine("Gen "+GC.GetGeneration(o));//0

//执行垃圾收集器,提高对象代龄
GC.Collect();
Console.WriteLine(
"Gen " + GC.GetGeneration(o));//1

GC.Collect();
Console.WriteLine(
"Gen " + GC.GetGeneration(o));//2

GC.Collect();
Console.WriteLine(
"Gen " + GC.GetGeneration(o));//2(最大值)

o
= null;//销毁对象,此时对象的代龄为2

Console.WriteLine(
"Collect Gen 0");
GC.Collect(
0);//收集第0代对象,其实没有0代对象
GC.WaitForFullGCApproach();//不会调用Finalize

Console.WriteLine(
"Collect Gen 0");
GC.Collect(
1);//收集第0代对象,其实没有1代对象
GC.WaitForFullGCApproach();//不会调用Finalize

Console.WriteLine(
"Collect Gen 0");
GC.Collect(
2);//收集第2代对象,对象真正被收集
GC.WaitForFullGCApproach();//调用Finalize
}
}

class GenObj
{
~GenObj()
{
Console.WriteLine(
"In Finalize method");
}
}
}

执行结果

2010051821422755.jpg

深刻的了解了代龄啊

 大尺寸对象

  任何占用内存大于等于85000字节的对象都被认为是大尺寸对象(large object)。大尺寸对象从一个特殊的大尺寸对象托管堆中分配的。该托管堆中对象的终止化和内存释放行为与前面描述的小尺寸对象相同。但是大尺寸对象不会被压缩,因为在托管堆中移动大尺寸对象会浪费CPU比较多的时间。

  大尺寸对象总是被认为是2代的。


           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值