zoukankan      html  css  js  c++  java
  • 垃圾自动回收的一个方案

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

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

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

    1.避免生成循环

    2.能够识别出循环

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

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

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

    1. 多叉树结构。

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

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

    4.树根是栈指针引用。

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

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

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

    8.

    待续

  • 相关阅读:
    php常见细节错误
    php+jquery注册实例
    yii2添加自定义字段
    yii2开启session
    yii2中textarea中的默认值设置
    yii2.0分页
    yii2多语言
    mysql中查询值为NULL的记录
    yii Html中的a标签使用
    yii2顶部导航使用
  • 原文地址:https://www.cnblogs.com/Nobel/p/1945380.html
Copyright © 2011-2022 走看看