什么是內存泄漏
內存泄露是指當一塊內存不再被應用程序使用的時候,由於某種原因,這塊內存沒有返還給操作系統或者內存池的現象。內存泄漏可能會導致應用程序卡頓或者崩潰。
常見的內存泄漏
以上代碼創建了一個作為 element 元素事件處理程序的閉包,而這個閉包則又創建了一個循環引用,匿名函數中保存了一個對 element 對象的引用,因此無法減少 element 的引用數。只要匿名函數在,element 的引用數至少是 1,因此它所占用的內存就永遠無法回收。
解決辦法:
意外的全局變量
在 JavaScript 非嚴格模式中,未定義的變量會自動綁定在全局對象上(window/global),比如:
foo 執行的時候,由於內部變量沒有定義,所以相當於 window.bar = 'something'
,函數執行完畢,本應該被銷毀的變量 bar 卻永久的保留在內存中了。
解決辦法,使用嚴格模式。
雖然全局變量上綁定的變量無法被垃圾回收,但是有時需要使用全局變量去存儲臨時信息,這個時候要格外小心,並在變量使用完畢后設置為 null,以回收內存。
全局變量注意事項
盡管我們討論了一些意外的全局變量,但是仍有一些明確的全局變量產生的垃圾。它們被定義為不可回收(除非定義為空或重新分配)。尤其當全局變量用於臨時存儲和處理大量信息時,需要多加小心。如果必須使用全局變量存儲大量數據時,確保用完以后把它設置為 null 或者重新定義。與全局變量相關的增加內存消耗的一個主因是緩存。緩存數據是為了重用,緩存必須有一個大小上限才有用。高內存消耗導致緩存突破上限,因為緩存內容無法被回收。