Ansel's Blog

It would probably render the application more complex

博客园 首页 新随笔 联系 订阅 管理
标记和压缩算法

当应用程序启动的时候,有一定数量的地址将被分配给应用程序,这些地址空间成为管理堆(Managed Heap)管理堆用于存储应用程序中的对象索引。如果要穿件一个新对象,而应用程序的管理堆中没有了足够的空间的时候,就会运行垃圾回收过程。

如果原有对象超出了范围,就释放空间并且创建新的对象;但是如果垃圾收集器不能够释放空间,应用程序仍然会创建对象,同时会出现错误。




举例: za在应用程序开始时,已创建A,B,C,D几个对象,这些对象的索引放在管理堆中如图:

D

C

B

A


在应用程序的生命周期中需要创建一个对象E。由于管理堆中没有可分配的足够空间,需要执行垃圾收集。从上次收集后对象A,C已经超出了范围。

在垃圾收集开始时,产生了范围之内所有应用对象的列表;该列表包括对象B、D。算法逐步检索管理堆,查找目前不在列表中的对象。一旦发现超出范围的对象就将这些对象标记为无法得到,同时压缩管理堆。然后把新对象E的索引置入堆中。

代的概念

为了提高垃圾回收时检索堆的效率,提出了代的概念。代的理论假设对象存在的时间越长,说明在堆中超出范围的可能性就越小。因此首先检索新的对象,如果仍然需要空间再检测时间较长的对象,这样能提高效率

.net垃圾回收支持三种代:代0、代1和代2。
代0:其中的对象是上次垃圾收集时创建的对象;
代1:经过一次垃圾回收后仍然在范围之内的对象;
代2:经过多次垃圾回收后仍然在范围之内的对象。

垃圾回收时,如果在对代0的对象收集后空间仍然不足以分配给新对象,垃圾回收器就会移到代1,如果还不够,那么就移到代2。
posted on 2005-08-16 10:10  Ansel  阅读(835)  评论(2编辑  收藏  举报