文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>垃圾自动回收的一个方案

垃圾自动回收的一个方案

时间:2011-01-26  来源:诺贝尔

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

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

 

我提出的一个方案,和大家分享:

第一,每个对象分两部分,一部分计算引用计数;另一部分统计有多少栈引用。释放的条件有两个,一个是引用计数为0,一个是没有位于栈的引用(包括间接的)。

第二,当一个栈引用释放了,那么就遍历所有具备该栈引用的对象,如果他没有其他栈引用,就释放这个对象。

第三,当释放引用时,检测是否为0,为0就释放对象。

第四,这个是耗费内存的方案,需要深度优化。

 

可行性分析:

1.逻辑前提是正确的。所有对象都是直接或间接被某个栈指针引用

2.具体方案具体分析。。

单个栈指针引用的情况:

建立阶段:标记栈指针,计数增加1.

活动期间:计数增减,不改变标记。

释放阶段:标记消失或计数为0.

时机:栈指针释放期间,引发被应用对象的释放。

 

多个栈指针引用的情况:

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载