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相关文章推荐
- 浅谈js 闭包引起的内存泄露问题
- Js内存泄露问题总结
- JavaScript Memory Leaks(js内存泄露的问题)
- 几个ajax js性能优化和内存泄露问题及检测分析工具
- 说说JS在IE中的内存泄露问题
- 一个JS图片放大镜,实现动态记录的图片放大,避免内存泄露,解决IE6下无法遮盖select控件问题
- node.js内存泄露问题记录
- js内存泄露问题
- 几个ajax js性能优化和内存泄露问题及检测分析工具
- js内存泄露问题
- 一个JS图片放大镜,实现动态记录的图片放大,避免内存泄露,解决IE6下无法遮盖select控件问题
- 解决JS内存泄露之js对象和dom对象互相引用问题
- js内存泄露问题
- js内存泄露问题 .
- Js内存泄露问题总结
- Js内存泄露问题
- node.js内存泄露问题记录
- js内存泄露问题
- 使用valgrind检测内存泄露的问题。