zoukankan      html  css  js  c++  java
  • Javascript的垃圾回收机制

      在js中,所需内存的分配以及无用内存的回收完全实现了自动管理。垃圾收集机制原理:找出那些不再使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性的执行这一操作垃圾收集的方式有两种:标记清除法和引用计数法。

      标记清除法:给存储在内存中的所有变量添加标记,去除掉环境中的变量以及被环境中的变量引用的变量的标记,剩下的带标记的就是准备删除的变量,这是一种比较常用的方法,大多数浏览器中采用的都是这种方法。

      引用计数法:声明一个变量,将一个引用类型的值赋值给该变量,则该变量的引用次数就为1,如果该变量又赋值给另一个变量,则该变量引用次数加1,如果包含该变量的引用的变量获取了新的值,则该变量的引用次数减1;如果引用次数为0,则被认为是垃圾进行回收。该方法不太常见,IE9以下的DOM和BOM采用的就是这种垃圾收集方法,该方法在遇到循环引用时会产生内存泄漏,导致已销毁变量的内存空间无法被回收,例如:

    1 function test(){
    2         var a=new Object; //a的引用次数为1
    3         var b=new Object;  //b的引用次数为1
    4         a.r=b;        //b的引用次数为2
    5         b.r=a;        //a的引用次数为2
    6 }

    a与b互相引用,最后两个变量的引用次数都为2,所以当函数执行完后,虽然连个变量都被销毁,但由于它们的引用次数为2,释放的内存无法被回收。所以在IE9以下操做DOM和BOM时就需要注意这个问题,而操做其他对象时IE也是采用的标记清除,不用担心循环引用的问题,IE9以上已经将DOM和BOM对象完全转化为js对象,也不用担心这个问题。

      当有不再使用的全局变量和全局对象时,最好通过解除引用将其手动设置为null等待回收机制回收。

      

  • 相关阅读:
    关于 flutter_boost splash加载动画
    [BS-23] AFN网络请求上拉/下拉刷新的细节问题总结
    [BS-22] Objective-C中nil、Nil、NULL、NSNull的区别
    [BS-21] 关于OC中对象与指针的思考
    [BS-20] 导航控制器和视图控制器在添加控制器的区别
    ios runtime swizzle
    关于C、OC、C++、OC++、Swift的一些常识
    iOS多线程知识总结--GCD
    使用代码创建AutoLayout约束
    iOS中NSLog输出格式大全
  • 原文地址:https://www.cnblogs.com/cjw-ryh/p/7132511.html
Copyright © 2011-2022 走看看