js内存泄露问题

2/22/2017来源:ASP.NET技巧人气:984

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