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(); } } } } |
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库