美文网首页
【js】js垃圾回收是什么?

【js】js垃圾回收是什么?

作者: Adder | 来源:发表于2021-06-08 12:11 被阅读0次

    长久不用的一些在内存中的变量会被浏览器回收掉,具体的咋回收的呢

    GC——垃圾回收

    找出不再使用的变量,然后释放掉占用的内存;因此垃圾回收器会定期的执行。

    var a = "造火箭";
    var b = "拧螺丝";
    var a = b;
    

    造火箭这个字符串失去了引用(之前是被a引用),系统检测到之后,就会释放该字符串的储存空间,以回收利用

    如何知道,到底哪些内存可回收?

    一个循环引用的🌰:

    function cycle() {
        var o1 = {};
        var o2 = {};
        o1.a = o2;
        o2.a = o1; 
    
        return "cycle reference!"
    }
    
    cycle();
    

    1.标记清除

    标记阶段:从根部开始,逐层往里遍历,遍历到堆中的对象时,说明有被使用,立马打上标记,继续往下遍历直到最深的一层节点
    清除阶段:遍历整个堆,回收没有打上标记的对象。

    • 可以解决循环引用问题,因为两个对象从全局对象出发无法获取。因此,他们无法被标记,他们将会被垃圾回收器回收
    • 是否加标记,只需要分两种情况做标志位,节省空间

    所以现在对于主流浏览器来说,只需要切断需要回收的对象与根部的联系。

    2.引用计数 (现代浏览器不常用了)

    优点和原理:

    • 即刻回收,当被引用次数为0时,对象马上会把自己作为空闲空间连到空闲链表上,也就是,在变成垃圾的时候就立刻被回收。
    • 因此就不用去遍历堆里面的所有活动对象和非活动对象

    劣势:

    • 万一被引用次数很大,需要很大内存来储存记录的次数;
    • 循环引用无法解决,因为他们的被引用次数,均不会为零

    相关文章

      网友评论

          本文标题:【js】js垃圾回收是什么?

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