1. 程式人生 > >JavaScript記憶體洩漏

JavaScript記憶體洩漏

記憶體洩漏就是沒有及時釋放不再用到的記憶體。
記憶體洩漏會使記憶體佔用越來越高,帶來效能問題,嚴重時還可能造成崩潰。

垃圾回收機制

標記清除
這是大多數瀏覽器使用的方法。
當變數進入執行環境時,垃圾回收器將其標記為“進入環境”,當變數離開環境時(函式執行結束)將其標記為“離開環境”並回收其記憶體。

引用計數
這是低版本IE瀏覽器採用的方式,易引起記憶體洩露。
跟蹤一個值的引用次數,宣告一個變數並將一個引用型別的值賦給該變數時,引用次數+1.當這個變數指向其他值的時候引用次數-1。當引用次數為0時就會被回收。
引起洩露的原因是,不能解決迴圈引用的問題。

原因

意外的全域性變數


全域性變數不會被回收。

function leaks(){  
    leak = 'xxxxxx';
}

閉包
閉包可以維持函式內部的區域性變數使其不能被釋放。
IE標準下,在閉包中引用的DOM元素將無法被回收。
解決方法:把不再需要的DOM元素手動設定為null。

DOM清空或刪除時,事件未清除
當DOM元素被清空或刪除時,若元素繫結的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手動設定為null,不然會存在記憶體洩露。

DOM子元素被父元素引用

定時器
定時器不再需要時,沒有被clear,定時器內部的回撥及依賴的變數都不能被回收。

如何發現記憶體洩露

Chrome中的Timeline面板裡勾選memory,點選左上角的錄製按鈕,然後在頁面上進行操作,一段時間後點擊stop,面板就會顯示這段時間內的記憶體佔用情況。如果趨近平穩,表明不存在記憶體洩露。如果記憶體佔用一次比一次大,那麼就存在記憶體洩露。