您的位置:首页 > Web前端 > JavaScript

js内存泄露问题

2017-02-21 20:35 176 查看

1、js自动垃圾收集机制

javascript具有自动垃圾收集机制。执行环境会负责管理代码执行过程中使用的内存。而在C和C++之类的语言中,开发人员需要手动跟踪内存的使用情况。而在编写js程序时,程序员不用再关心内存使用问题,所需内存的分配以及无用内存对的回收完全实现的自动化。为此,垃圾收集器会按照固定的时间间隔,周期性地执行这一操作。


2、浏览器中js垃圾回收机制

(1)标记清除

js最常用的垃圾收集方式是标记清除。当变量进入执行环境(如函数中声明了一个变量)时,就将这个变量标记为不可回收;如果该该变量出了执行环境,此时该变量就标记为可回收。在一定周期后,如果变量被标记为"可回收",就将其回收掉。


(2)引用计数

变量默认计数为0,如果有其他变量对有使用,就引用计数 +1;如果 对该变量使用的数据释放掉了,那么此时引用计数 -1 ;在一定周期后,如果变量引用计数为0,就将其回收掉。


3、导致内存泄露的情况

(1)隐式声明的全局变量

定义在window上的全局变量不可回收

function fn(){
a = 10; //a 为全局变量不可回收
//window.a = 10 //实质
}


function fm(){
this.b = 20;
}
fm(); // this->window,window.b = 20


如果必须使用全局变量来存储大量数据,那么要确保使用完以后把它设置为null或者重新定义。相关的,增加内存消耗的一个主要原因是缓存,所以缓存要有大小限制,注意缓存是无法被回收的。

(2)闭包引起的内存泄露

var c = (function(){
var d = '123';//被闭包引用,相当于缓存起来了,无法被回收
return function(){
console.log(d)
}
})(); //123


(3)定时器

setInterval(function(){
var a = document.getElementById('a')
if(a){
a.innerHTML = '12345'
}
},500)


在chrome调试器上可以看到,不停的f10,代码一致循环执行,即使没有a节点,同样一直执行。无法被清除。

3、使用chrome浏览器可以查看内存泄露问题

http://developer.51cto.com/art/201605/511624.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript