英文原文:JavaScript Memory Leaks
1. 什麼是記憶體泄露?
記憶體泄露是指分配給應用的記憶體不能被重新分配,即使在記憶體已經不被使用的時候。正常情況下,記憶體回收行程在 DOM 元素和 event 處理器不被引用或訪問的時候回收它們。但是,IE 的早些版本(IE7和之前)中記憶體泄露是很容易出現的,因為記憶體管理器不能正確理解 Javascript 生命週期而且在周期被打破(可以通過賦值為 null 實現)前不會回收記憶體。
2. 為什麼你需要注意它?
在大型 Web 應用程式中記憶體泄露是一種常見的無意的編程錯誤。記憶體泄露會降低 Web 應用程式的效能,直到浪費的記憶體超過了系統所能分配的,應用程式將不能使用。作為一位 Web 開發人員,開發一個滿足功能要求的應用程式只是第一步,效能要求和 Web 應用程式的成功是同樣重要的,更何況它可能會導致應用程式錯誤或瀏覽器崩潰。
3. Javascript 中出現記憶體泄露的主要原因是什嗎?
1) 循環參考
一個很簡單的例子:一個 DOM 對象被一個 Javascript 對象引用,與此同時又引用同一個或其它的 Javascript 對象,這個 DOM 對象可能會引發記憶體泄露。這個 DOM 對象的引用將不會在指令碼停止的時候被記憶體回收行程回收。要想破壞循環參考,引用 DOM 元素的對象或 DOM 對象的引用需要被賦值為 null。
2) Javascript 閉包
因為 Javascript 範圍的限制,許多實現依賴 Javascript 閉包。如果你想瞭解更多閉包方面的問題,請查看我的前面的文章 JavaScript Scope and Closure 。
閉包可以導致記憶體泄露是因為內部方法保持一個對外部方法變數的引用,所以儘管方法返回了,內部方法還可以繼續訪問在外部方法中定義的私人變數。對 Javascript 程式員來說最好的做法是在頁面重載前斷開所有的事件處理器。
3) DOM 插入順序
當 2 個不同範圍的 DOM 對象附加到一起的時候,一個臨時的對象會被建立。這個 DOM 對象改變範圍到 document 時,那個臨時對象就沒用了。也就是說, DOM 對象應該按照從當前頁面存在的最上面的 DOM 元素開始往下直到剩下的 DOM 元素的順序添加,這樣它們就總是有同樣的範圍,不會產生臨時對象。
4) 如何檢測?
記憶體泄露對開發人員來說一般很難檢測,因為它們是由大量代碼中的一些意外的錯誤引起的,但它在系統記憶體不足前並不影響程式的功能。這就是為什麼會有人在很長時間的測試期中收集應用程式效能指標來測試效能。
最簡單的檢測記憶體泄露的方式是用工作管理員檢查記憶體使用量情況。在 Chrome 瀏覽器的新選項卡中開啟應用並查看記憶體使用量量是不是越來越多。還有其他的調試工具提供記憶體監視器,比如 Chrome 開發人員工具。這是Google開者這網站中的堆分析的特性的教程。
參考:
1. http://javascript.crockford.com/memory/leak.html
2. http://msdn.microsoft.com/en-us/library/Bb250448
3. http://www.ibm.com/developerworks/web/library/wa-memleak/
(OsChina.NET 編譯)
轉自:http://kb.cnblogs.com/page/141401/