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