垃圾自动回收的一个方案
时间:2011-01-26 来源:诺贝尔
1.vb6的计数方案。简单高效,但是有bug。当对象成员引用自身,计数为2,当程序实际上不再使用这个对象,这个对象计数为1,因此无法自动释放。
2..net的方案。我自己猜测是这样:运行环境遍历当前的堆栈(也就是函数运行的环境,如果不在这个上下文中,这个对象实际上就不被直接使用,如果也不被间接使用,那么就能确定他应该释放了),然后对堆栈中的对象进行成员检测,成员的成员检测,如此类推,最后把不在里面的对象释放掉。可想而知,这个算法代价非常高昂。如果当前有100万个对象,就要检测100万次。当然,这只是我的猜测,估计.net进行了高度的优化。
我提出的一个方案,和大家分享:
第一,每个对象分两部分,一部分计算引用计数;另一部分统计有多少栈引用。释放的条件有两个,一个是引用计数为0,一个是没有位于栈的引用(包括间接的)。
第二,当一个栈引用释放了,那么就遍历所有具备该栈引用的对象,如果他没有其他栈引用,就释放这个对象。
第三,当释放引用时,检测是否为0,为0就释放对象。
第四,这个是耗费内存的方案,需要深度优化。
可行性分析:
1.逻辑前提是正确的。所有对象都是直接或间接被某个栈指针引用
2.具体方案具体分析。。
单个栈指针引用的情况:
建立阶段:标记栈指针,计数增加1.
活动期间:计数增减,不改变标记。
释放阶段:标记消失或计数为0.
时机:栈指针释放期间,引发被应用对象的释放。
多个栈指针引用的情况:
相关阅读 更多 +