Posted on 2008-03-13 21:26
bluoy 阅读(341)
评论(0) 编辑 收藏
.NET垃圾收集器的过去、现在和未来(一)
Patrick Dussud介绍:
Patrick Dussud在微软工作了11年,曾经负责VBA、Jscript、MS Java等语言运行时的垃圾收集器(Garbage Collector)的设计,目前负责.NET CLR垃圾收集器的设计。他是.NET CLR的架构师,WinFX的首席架构师,Windows架构师组的成员。
在微软之前,Patrick是德州仪器(TI)Explorer工作站系统的主要设计人,Lucid公司Energize产品的首席架构师。
关键内容摘要
1. 微管理 / 内存的显式管理 --- 手动内存管理(new/delete)
你必须保证在释放之前内存没有被别人使用,如果你把内存给了别人,往往你就不确定应该何时释放内存了。当你释放了内存,不知道别人正在使用这块内存时,就产生了程序崩溃的问题。所以,当你显式进行“new”和“delete”时,内存管理是一个复杂的问题,并且,此时你的代码不可组合。要么你必须确定对自己的内存有完全的控制,因此,要达到这种完全隔离的目的,你必须在将内存传递给别的模块时进行完全拷贝,这样,别的模块就只对这个完全拷贝的内存负责。要么你就得在某个地方形成对整个内存池的统一的管理,这就是自动化内存管理,这就是垃圾收集器的工作。
2. 对象终止器的调用时机由垃圾收集器决定,这些对象的析构函数被调用的先后顺序是无法预先确定的。提出了“关键终止化对象”的概念。当有一系列对象需要终止化时,关键终止化对象最后被终止化,直到上层对象干完工作前。
3. 工作机理: 垃圾收集器首先遍历所有的栈和静态变量,然后返回最初的树集。然后遍历树集对程序能够到达的每一个对象作标记。此时,我们就能逐个对象地检查内存,发现它被标记了,好的,留下。没有被标记?喔,我们有一个垃圾了。
4. 垃圾收集器的绝大部分速度和效率都来源于对回收策略的调整。通过保持内存紧凑,形成缓存本地化,页面本地化等等优势,很可能其效率甚至高于传统“new”和“delete” 操作,尤其是对于非常难以管理的服务器内存来说更是如此。