美文网首页js css htmlJavaScript理论知识
07:JS 中的垃圾回收机制

07:JS 中的垃圾回收机制

作者: 小小前端搬运工 | 来源:发表于2022-05-11 23:11 被阅读0次

    必要性:由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript 程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript 的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。

    这段话解释了为什么需要系统需要垃圾回收,JS 不像 C/C++,他有自己的一套垃圾回收机制(Garbage Collection)。JavaScript 的解释器可以检测到何时程序不再使用一个对象了,当他确定了一个对象是无用的时候,他就知道不再需要这个对象,可以把它所占用的内存释放掉了。例如:

    var a="hello world"; 
    
    var b="world"; 
    
    var a=b; 
    
    //这时,会释放掉"hello world",释放内存以便再引用 
    

    垃圾回收的方法:标记清除计数引用

    标记清除

    这是最常见的垃圾回收方式,当变量进入环境时,就标记这个变量为”进入环境“,从逻辑上讲,永远不能释放进入环境的变量所占的内存,永远不能释放进入环境变量所占用的内存,只要执行流程进入相应的环境,就可能用到他们。当离开环境时,就标记为离开环境。

    垃圾回收器在运行的时候会给存储在内存中的变量都加上标记(所有都加),然后去掉环境变量中的变量,以及被环境变量中的变量所引用的变量(条件性去除标记),删除所有被标记的变量,删除的变量无法在环境变量中被访问所以会被删除,最后垃圾回收器,完成了内存的清除工作,并回收他们所占用的内存。

    引用计数法

    另一种不太常见的方法就是引用计数法,引用计数法的意思就是每个值没引用的次数,

    当声明了一个变量,并用一个引用类型的值赋值给改变量,则这个值的引用次数为 1,;

    相反的,如果包含了对这个值引用的变量又取得了另外一个值,则原先的引用值引用次数就减 1,当这个值的引用次数为 0 的时候,说明没有办法再访问这个值了,因此就把所占的内存给回收进来,这样垃圾收集器再次运行的时候,就会释放引用次数为 0 的这些值。

    用引用计数法会存在内存泄露,下面来看原因:

    function problem() { 
    var objA = new Object(); 
    var objB = new Object(); 
    objA.someOtherObject = objB; 
    objB.anotherObject = objA; 
    }
    

    在这个例子里面,objA 和 objB 通过各自的属性相互引用,这样的话,两个对象的引用次数都为 2,在采用引用计数的策略中,由于函数执行之后,这两个对象都离开了作用域,函数执行完成之后,因为计数不为 0,这样的相互引用如果大量存在就会导致内存泄露。

    特别是在 DOM 对象中,也容易存在这种问题:

    var element=document.getElementById(’‘); 
    var myObj=new Object(); 
    myObj.element=element; 
    element.someObject=myObj; 
    

    这样就不会有垃圾回收的过程。

    相关文章

      网友评论

        本文标题:07:JS 中的垃圾回收机制

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