javascript 内存泄露(其实是在浏览器作为容器运行时内存泄露)分析

虾米哥 阅读:211 2021-06-07 08:28:02 评论:0

  首先明确点认识,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特殊对象的循环引用而已。

 

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

  


标签:JavaScript
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号