內(nèi)存泄漏:一塊被分配的內(nèi)存既不能使用又不能被釋放
內(nèi)存泄漏的幾種情況:
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節(jié)點或ActiveX對象相互引用,在IE中垃圾回收系統(tǒng)不會發(fā)現(xiàn)他們之間循環(huán)關系與系統(tǒng)中其他對象是隔離的并釋放他們,最終他們將被保留在內(nèi)存中,直到瀏覽器關閉
3.閉包也會引起內(nèi)存泄漏
解決在確定某個變量不會再次被引用。手動釋放其內(nèi)存,即將此變量設置為null
垃圾回收機制
js中垃圾回收機制有兩種:
1.標記清除:最常用!
垃圾收集器會在運行的時候給存儲在內(nèi)存的所有變量加上一個標記,然后會去掉環(huán)境中的變量以及環(huán)境中被引用的變量,在此之后再被加上標記的變量就是為準備刪除的變量
2.引用計數(shù)
跟蹤記錄每一個個值的被引用次數(shù),當一個值引用次數(shù)為0時,回收
但是這種方法有一個很嚴重的問題??!循環(huán)引用
循環(huán)引用就是對象A中包含一個指向?qū)ο驜的指針,而對象B中又包含一個指向A的指針,他們的引用次數(shù)永遠不會是0