JavaScript垃圾回收机制

93 阅读2分钟

JavaScript垃圾回收机制

  • 引用计数
    不常用的垃圾回收策略是引用计数,跟踪并记录每个值被引用的次数,如果一个值的引用次数为0,表示这个值不在用到了,就会将这部分内存释放掉。
   var obj={a:123};//引用次数+1
   var obj1={a:123};//引用次数+1  
   var obj={};//引用次数-1
   var obj=null;//引用次数为0

当声明了一个变量并将一个引用类型值赋值该变量时,则这个值的引用次数就是1,如果同一个值又被赋给另外一个变量,则该值的引用次数加1.相反,如果包含这个值的引用的变量又取得了另外一个值,则这个值的引用次数减1,当这个值得引用次数变成0时,则说明没有办法在访问这个值了,因而就可以将其占用的内存空间回收起来。这样,当垃圾收集器下次在运行时,它就会释放那些引用次数为零的值所占用的内存。
引用计数还会遇到一个严重的问题:循环引用

   function fn(){
     const objectA=new Object();
     cosnt objectB=new Object();
     objectA.someOtherObject=objectB
     objectB.anotherObject=objectA
   }

执行fn函数时创建一个objectA变量指向一个空的object、创建一个objectB变量执行一个空的object。并将objectB的引用赋值给objectA的someOtherObject属性,将objectA的引用赋值给objectB的anotherObject的属性。此时两个空对象的引用数量都为2. 因此在函数执行结束后objectA和objectB所指向的空对象都不能被回收,如果多次执行会导致内存中有大量的对象无法被清除。

  • 标记清除
    js中常用的垃圾回收机制方式就是标记清除。垃圾回收机制在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去掉处在环境中的变量及被环境中的变量引用的变量标记。而在此之后剩下的带有标记的变量被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾回收机制到下一个周期运行时,将释放这些变量的内存,回收它们所占用的空间。

释放内存 把声明的对象赋值为null

    let obj = {} // 开辟内存
    obj.name = 'haha' // 标记内存
    obj = null // 释放内存