定义
内存资源已经分配,但是得不到及时的回收,内存无法复用,最终导致内存溢出。
原因
浏览器的垃圾回收机制是通过判断从根节点是否可达到此节点来确定是否为垃圾,但是某些节点所占内存不会释放,就导致了内存泄漏问题。
常见的内存泄漏
- 缓存
有些时候为了方便数据的复用会使用缓存,高内存消耗会使得缓存突破上限。 - 意外的全局变量
未定义的变量会在全局对象创建一个新变量。在浏览器中,全局对象是 window 。
text="hidden global variable"
未定义变量,但JavaScript处理未定义变量相对比较宽松,未定义变量会在全局对象上定义一个变量,而浏览器的全局变量是window,等价于window.text。
同样的this.text="hidden global variable"
中的this指向为window,也相当于window.text。 - 计时器未清理
例如setInterval,setInterval使用过度占用大量内存,需要及时清理。
var data = getData();
setInterval(function() {
var node = document.getElementById('node');
if(node) {
node.innerHTML = JSON.stringify(data));
}
}, 1000);
定义了一个计时器,每1s将数据存入node节点,但是当node节点删除后,data里面的数据是无法被回收的。
- 闭包
在 IE 浏览器中闭包会很容易导致内存泄露。
function addthing() {
var ll = document.getElementById('ll');
ll.onclick = function() {
ll.style.backgroundColor = 'blue';
}
}
对ll 的引用不小心被放在一个匿名内部函数中。使得JavaScript 对象(这个内部函数)和本地对象之间(ll)创建了一个循环引用。