zoukankan      html  css  js  c++  java
  • javascript 内存泄露(其实是在浏览器作为容器运行时内存泄露)

      首先明确点认识,javascript 使用的是mark-and-sweep算法进行GC处理。浏览器对DOM采用的是计数器算法进行GC处理。所以如果js中没用dom的操作,纯js对象的话,javascript用自身的GC回收机制是不会产生内存溢出的,当有dom参与到js脚本中,如果对dom对象进行了循环引用,比如闭包(闭包是一种特殊的循环引用),浏览器就无法确认和兼容两种GC回收算法,导致发生内存泄露,就算页面刷新都不能清除掉,只能关闭浏览器。

    闭包:  

    function A()...{
        var a=document.createElement("div");
        a.onclick=function()...{
            alert("hi");
        }
    }
    A();

    假设A()执行时创建的作用域对象叫做ScopeA 找到以下引用关系
    ScopeA
    引用DOM对象document.createElement("div");
    DOM
    对象document.createElement("div");引用函数function(){alert("hi")}
    函数function(){alert("hi")}引用ScopeA

    这样就很清楚了,所谓closure泄露,只不过是几个js特殊对象的循环引用而已。

     

    至于如何避免引入内存泄露隐患,网上很多说明,我也是都看看而已,没有总结得很好的,这里就列举了。

      

  • 相关阅读:
    ny 58 最少步数 (BFS)
    Oracle 参数文件
    Oracle 密码文件
    Oracle 表空间与数据文件
    Oracle 回滚(ROLLBACK)和撤销(UNDO)
    Oracle 控制文件(CONTROLFILE)
    Oracle 联机重做日志文件(ONLINE LOG FILE)
    Oracle 常用目录结构(10g)
    Oracle 归档日志
    instance_name,db_name,oracle_sid之间的关系
  • 原文地址:https://www.cnblogs.com/onlywujun/p/3082984.html
Copyright © 2011-2022 走看看