CLR via C# 学习笔记(2012/3/13)

来源:互联网 发布:全自动加好友软件 编辑:程序博客网 时间:2024/05/06 10:09

第21章 自动内存管理

这一章主要是讲解垃圾回收的原理。在面向对象语言出现之前,比如C/C++,都是手动分配、回收内存的,很容易忘记回收内存,导致内存来不及回收,造成内存泄漏。而CLR采用了垃圾回收器来减轻开发人员的工作,可以专心面对程序层的技术处理,而不用考虑内存的分配与回收这种吃力不讨好的事情。

讲讲垃圾回收算法吧,垃圾回收算法的主要是包括两个阶段。

第一个阶段是标记:每个应用程序都包含一组根,这些根包含的是指向托管堆上的一组指针,也就是分配对象的地址。第一阶段,垃圾回收器会遍历这些根,根据这些根在应用程序中可达与不可达来进行标记,标记过的就说明对象还被使用。而不可达的对象就被视为垃圾。

第二个阶段是压缩:也就是移动内存,将存活的对象压缩到一起,留有更多的空间让程序继续使用。而这个过程是最耗性能的,所以应该尽可能地让垃圾回收器自己确定什么时候回收,而不要主动去回收。


CLR垃圾回收器采用一种机制:代。将内存分为3代:0、1、2代,代数越大,对象越老。提出这个机制的假设是:对象越新,生存期越短;对象越老,生存期越长。

也就是0代的最有可能是存在垃圾,最需要回收的地方,所以分配容量大小也是越小越少。这样能够更好地提升性能。

主要的工作流程是:分配的对象都放在0代上,当0代不能再放下新的对象时,垃圾回收器就执行一次垃圾回收,而存活的对象就移到1代里,然后不断重复这个过程,直到0代放不下,而1代也放不下里,这时垃圾回收器会回收0、1代的对象,1代的就变2代,0代变1代,一直这样下去,不断循环。

原创粉丝点击