什麼是內存洩露?
內存洩露是指分配給應用的內存不能被重新分配
即使在內存已經不被使用的時候
正常情況下
垃圾回收器在DOM 元素和event 處理器不被引用或訪問的時候回收它們
但是
IE 的早些版本(IE
和之前)中內存洩露是很容易出現的
因為內存管理器不能正確理解Javascript 生命周期而且在周期被打破(可以通過賦值為null 實現)前不會回收內存
Javascript 中出現內存洩露的主要原因是什麼?
) DOM 插入順序
當
個不同范圍的DOM 對象附加到一起的時候
一個臨時的對象會被創建
這個DOM 對象改變范圍到document 時
那個臨時對象就沒用了
也就是說
DOM對象應該按照從當前頁面存在的最上面的DOM 元素開始往下直到剩下的DOM 元素的順序添加
這樣它們就總是有同樣的范圍
不會產生臨時對象
) Javascript 閉包
因為Javascript 范圍的限制
許多實現依賴Javascript 閉包
如果你想了解更多閉包方面的問題
請查看我的前面的文章JavaScript Scope and Closure
閉包可以導致內存洩露是因為內部方法保持一個對外部方法變量的引用
所以盡管方法返回了
內部方法還可以繼續訪問在外部方法中定義的私有變量
對Javascript 程序員來說最好的做法是在頁面重載前斷開所有的事件處理器
) 循環引用
一個很簡單的例子
一個DOM 對象被一個Javascript 對象引用
與此同時又引用同一個或其它的Javascript 對象
這個DOM 對象可能會引發內存洩露
這個DOM 對象的引用將不會在腳本停止的時候被垃圾回收器回收
要想破壞循環引用
引用DOM 元素的對象或DOM 對象的引用需要被賦值為null
如何檢測?
內存洩露對開發者來說一般很難檢測
因為它們是由大量代碼中的一些意外的錯誤引起的
但它在系統內存不足前並不影響程序的功能
這就是為什麼會有人在很長時間的測試期中收集應用程序性能指標來測試性能
最簡單的檢測內存洩露的方式是用任務管理器檢查內存使用情況
在Chrome 浏覽器的新選項卡中打開應用並查看內存使用量是不是越來越多
還有其他的調試工具提供內存監視器
比如Chrome 開發者工具
這是谷歌開者這網站中的堆分析的特性的教程
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26701.html