內存泄漏

Q: 什麼是內存泄露?瀏覽器

A:已經再也不使用的內存未能被程序釋放,叫內存泄露(memory leak)。閉包

Q: 什麼狀況下出現內存泄漏?函數

首先了解一下【垃圾回收】:垃圾回收(英語:Garbage Collection,縮寫爲GC)在計算器科學中是一種自動的存儲器管理機制。當一個計算機上的動態存儲器再也不須要時,就應該予以釋放,以讓出存儲器,這種存儲器資源管理,稱爲垃圾回收。this

A: 當一塊內存再也不用到,可是垃圾回收機制又沒法釋放這塊內存的時候,就致使內存泄漏。spa

===========================================================================對象

出現內存泄露的的幾種常見狀況:事件

1、全局變量ip

由全局變量在程序終止前不會被垃圾回收,而JavaScript對未聲明變量的處理方式是在全局對象上建立該變量的引用。瀏覽器中,全局即window對象,在關閉窗口或刷新前不會釋放。內存

  全局變量的狀況:資源

  一、未聲明變量: a = 1

  二、直接調用內含this的構建函數,this會指向window,而this擴展的屬性與方法,會綁定到window上

2、閉包也會形成內存泄漏 (先了解下【閉包】:一個函數與它的做用域鏈構成閉包。)

閉包內的函數內部調用了做用域鏈中的變量,會新分配內存來存儲這些變量,特別是柯里化最容易形成這種問題。

3、setinterval

4、事件監聽(EventListener):GC不會對事件監聽主動回收,換句話說須要開發者主動處理移除

 

===============

PS: js回收機制分爲兩種:「標記清除」&「引用計數」,主流新生代瀏覽器都是「標記清除」法,只有老款IE(ie8及如下)用的是「引用計數」法,由於「引用計數法」在變量循環調用時會形成內存泄漏,基本被後續瀏覽器拋棄。

相關文章
相關標籤/搜索