JavaScript記憶體洩漏
阿新 • • 發佈:2018-12-10
記憶體洩漏就是沒有及時釋放不再用到的記憶體。
記憶體洩漏會使記憶體佔用越來越高,帶來效能問題,嚴重時還可能造成崩潰。
垃圾回收機制
標記清除
這是大多數瀏覽器使用的方法。
當變數進入執行環境時,垃圾回收器將其標記為“進入環境”,當變數離開環境時(函式執行結束)將其標記為“離開環境”並回收其記憶體。
引用計數
這是低版本IE瀏覽器採用的方式,易引起記憶體洩露。
跟蹤一個值的引用次數,宣告一個變數並將一個引用型別的值賦給該變數時,引用次數+1.當這個變數指向其他值的時候引用次數-1。當引用次數為0時就會被回收。
引起洩露的原因是,不能解決迴圈引用的問題。
原因
意外的全域性變數
全域性變數不會被回收。
function leaks(){
leak = 'xxxxxx';
}
閉包
閉包可以維持函式內部的區域性變數使其不能被釋放。
IE標準下,在閉包中引用的DOM元素將無法被回收。
解決方法:把不再需要的DOM元素手動設定為null。
DOM清空或刪除時,事件未清除
當DOM元素被清空或刪除時,若元素繫結的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手動設定為null,不然會存在記憶體洩露。
DOM子元素被父元素引用
定時器
定時器不再需要時,沒有被clear,定時器內部的回撥及依賴的變數都不能被回收。
如何發現記憶體洩露
Chrome中的Timeline面板裡勾選memory,點選左上角的錄製按鈕,然後在頁面上進行操作,一段時間後點擊stop,面板就會顯示這段時間內的記憶體佔用情況。如果趨近平穩,表明不存在記憶體洩露。如果記憶體佔用一次比一次大,那麼就存在記憶體洩露。