垃圾自动回收的一个方案

 

1.vb6的计数方案。简单高效,但是有bug。当对象成员引用自身,计数为2,当程序实际上不再使用这个对象,这个对象计数为1,因此无法自动释放。

2..net的方案。我自己猜测是这样:运行环境遍历当前的堆栈(也就是函数运行的环境,如果不在这个上下文中,这个对象实际上就不被直接使用,如果也不被间接使用,那么就能确定他应该释放了),然后对堆栈中的对象进行成员检测,成员的成员检测,如此类推,最后把不在里面的对象释放掉。可想而知,这个算法代价非常高昂。如果当前有100万个对象,就要检测100万次。当然,这只是我的猜测,估计.net进行了高度的优化。

 

vb6的计数方案,无法解决循环引用的问题。因此如果基于计数法的设计思路有两个:

1.避免生成循环

2.能够识别出循环

 

面向对象的对象关系异常复杂,本质上就是一个网络,想不生成循环是非常困难的。

第二,从乱糟糟的对象网络中,找出循环代价也很高。

 

我设想的方案思路采取第一种,是这样的:

1. 多叉树结构。

2.单一树不产生循环计数。

3.多个树交叉将可能产生循环计数。

4.树根是栈指针引用。

5.任何时候,自身引用自身的计数都是无意义的。

6.单一树结构下,底层指向高层的引用是无意义的(因为根到改点必然有路径),标记为虚线。同一层级的指向也类似。当只有由上至下的指向,就不可能出现循环引用的情况。

7.虚线在特定的条件下会转换为实线,比如根到改节点的实线断开,虚线自然成为实线,而该节点自动降级成为原虚线的下层节点。

8.

 

待续

posted @ 2011-01-26 13:37  诺贝尔  阅读(349)  评论(0编辑  收藏  举报