.NET垃圾回收机制-代(generation)的原理分析
.NET的垃圾回收器是用一种叫代的原理,假设以下三种情况成立,则提出了代的概念。
- 越是新的对象,他的生存周期就越短
- 越是老得对象,它的生存周期就越长
- 回收一部分堆对象比回收全部堆对象性能高
第一步:当声明A-E 五个对象,它们在堆栈的分配情况(垃圾回收机制没有扫描之前),稍后,C和E对象变的不可达
第二步:当CLR初始化时,它为第零代分配了256K的空间(可能不同),代越高分配的内存越多。假设A-E分配了占用完了256k的内存,当F对象又被声明时,回收器就会进行第零代回收,C和E被回收,A,B,D被提升到一代。
第三步:F-K对象被分配到第零代,稍后,B,H和J变的不可达。如图,
第四步:但是垃圾回收器会检查第一代的空间,如果还足够,就会忽略第一代的回收,只回收第0代的。
第五步:继续申请L-O,同时,随着应用程序的运行G,L,M不可达,如图:
第六步:如果再继续申请P,此时如果第0代空间不足但是第1代的空间足,此时继续只回收第0代,忽略第1代,垃圾回收器回收以后:
第七步:并且继续分配P到S对象的空间:
第八步:当在分配T对象时,垃圾回收期扫描第一代和第零代,发现空间不足,此时,会启动垃圾回收第一代和第零代的空间:此时第0代的对象升至第1代,第1代的对象升至第2代。
垃圾回收机制仅有3代,当CLR初始化时,为第0代分配大约256K空间,第1代大约2M,第2代大约10M,基于这种假设才能提高应用程序的性能,要知道垃圾回收机制很影响性能的。
结果: