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等待回收机制回收。

      

  • 相关阅读:
    ActiveX控件的注册和反注册
    谷歌浏览器调用activex控件方法
    VC 中的ATL ActiveX 和 MFC ActiveX 有什么区别
    DirectX介绍(转)
    最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)(转)
    统计Visual Studio项目的代码行数
    【Sqlite3】sqlite_sequence表(转)
    linuxunix系统下的字符操作
    tif
    字符串截取
  • 原文地址:https://www.cnblogs.com/cjw-ryh/p/7132511.html
Copyright © 2011-2022 走看看