内存泄漏问题与垃圾回收机制
2017-05-03 本文已影响0人
zhangjianli
内存泄漏:一块被分配的内存既不能使用又不能被释放
内存泄漏的几种情况:
1.页面中元素被移除或替换时,元素绑定的时间仍然存在
<div id="div1">
<input type="button" name="" value="clickMe" id="btn1">
</div>
<script type="text/javascript">
var oButton = document.getElementById('btn1');
oButton.onclick=function(){
document.getElementById('div1').innerHTML="processing....";
};
</script>
解决:在onclick事件中将oButton.onclick=null;手动释放
2.两个DOM节点或ActiveX对象相互引用,在IE中垃圾回收系统不会发现他们之间循环关系与系统中其他对象是隔离的并释放他们,最终他们将被保留在内存中,直到浏览器关闭
3.闭包也会引起内存泄漏
解决在确定某个变量不会再次被引用。手动释放其内存,即将此变量设置为null
垃圾回收机制
js中垃圾回收机制有两种:
1.标记清除:最常用!
垃圾收集器会在运行的时候给存储在内存的所有变量加上一个标记,然后会去掉环境中的变量以及环境中被引用的变量,在此之后再被加上标记的变量就是为准备删除的变量
2.引用计数
跟踪记录每一个个值的被引用次数,当一个值引用次数为0时,回收
但是这种方法有一个很严重的问题!!循环引用
循环引用就是对象A中包含一个指向对象B的指针,而对象B中又包含一个指向A的指针,他们的引用次数永远不会是0