美文网首页
垃圾回收

垃圾回收

作者: 他在发呆 | 来源:发表于2017-07-02 22:20 被阅读0次

    概念:找出那些不再继续使用的变量,然后释放其占用的内存。他会按照固定的时间间隔,或代码执行中预定的收集时间,周期性的执行这一操作。

    标记清除

    • 最常用的
      当变量进入环境(例如在函数中声明一个变量)时,就将这个变量标记为进入环境。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,可以使用任何方式来标记变量
      垃圾收集器在运行时给存储在内存中的所有变量都加上标记。然后去掉环境中的变量以及被环境中变量引用的变量的标记。在此之后,再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾收集器完成内存收集工作。销毁那些带标记的值,并回收他们所占用的内存。

    引用计数

    跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,这个值的引用次数就是1.如果同一个值又被赋给另一个变量,则该值的引用次数加1.相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值引用次数减1.当这个值得引用次数变为0时,说明没办法再访问这个值了,就将其占用的内存空间回收回来。当垃圾收集器再次运行时,释放那些引用次数为零的值所占用的内存。

    限制:循环引用 => 指对象A中包含一个指向对象B的指针,而对象B中也包含了一个指向对象A的引用。

    function problem () {
        var objA = new Object();
        var objB = new Object();
        objA.otherObj = objB;
        objB.anotherObj = objA;
    }
    

    上面例子中,两个对象的引用次数都是2,。若是标记清除,由于函数执行后,两个对象都离开了作用域,因此这样合理。但在计数策略实现中,他们的引用次数永远不会是0.加入这个函数被多次调用,会导致大量内存得不到回收。

    解决:在不适用他们时,手动断开引用。
    = null;赋值为null.

    在IE中

    window.CollectGarbage();
    

    会立即执行立即回收机制。

    opera中,

    window.opera.collect();
    

    相关文章

      网友评论

          本文标题:垃圾回收

          本文链接:https://www.haomeiwen.com/subject/qwyocxtx.html