您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關瀏覽器中垃圾回收機制的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
垃圾回收是一種自動的內存管理機制。當計算機上的動態內存不再需要時,就應該予以釋放。
需要注意的是,自動的意思是瀏覽器可以自動幫助我們回收內存垃圾,但并不代表我們不用關心內存管理,如果操作不當,JavaScript中仍然會出現內存溢出的情況,造成系統崩潰。
由于字符串,數組,對象等都沒有固定大小,因此需要當它們大小已知時,才能對他們進行動態的存儲分配。JavaScript程序每次創建字符串,數組或對象時,解釋器都必須分配內存來存儲那個實體。
JavaScript解釋器可以檢測到何時程序不在使用一個對象了,當它確定這個對象是無用的時候,他就知道不再需要這個對象了,就可以把它占用的內存釋放掉了。
瀏覽器通常采用的垃圾回收有兩種方法:標記清除,引用計數。
標記清除
這是JavaScript中最常用的垃圾回收方式
從2012年起,所有現代瀏覽器都使用了標記清除的垃圾回收方法,除了低版本IE還是采用的引用計數法。
那么什么叫標記清除呢?
JavaScript中有一個全局對象,定期的,垃圾回收器將從這個全局對象開始,找出所有從這個全局對象開始引用的對象,再找這些對象引用的對象...對這些活躍的對象標記,這是標記階段。清楚階段就是清楚那些沒有被標記的對象。
標記清除有一個問題,就是在清除之后,內存空間是不連續的,即出現了內存碎片。如果后面需要一個比較大的連續的內存空間,那將不能滿足要求。而標記整理 方法可以有效德地解決這個問題。
在標記的過程中,引入了概念:三色標記法,三色為:
白:未被標記的對象,即不可達對象(沒有掃描到的對象),可回收
灰:已被標記的對象(可達對象),但是對象還沒有被掃描完,不可回收
黑:已被掃描完(可達對象),不可回收
標記整理:
標記階段與標記清除法沒什么區別,只是標記結束后,標記整理法會將存活的對象向內存的一邊移動,最后清理掉邊界內存。
引用計數
引用計數的含義是跟蹤記錄每個值被引用的次數。當一個變量A被賦值時,這個值的引用次數就是1,當變量A重新賦值后,則之前那個值的引用次數就減1。當引用次數變成0時,則說明沒有辦法再訪問這個值了,所以就可以清除這個值占用的內存了。
大多數瀏覽器已經放棄了這種回收方式
內存泄漏
為避免內存泄漏,一旦數據不再使用,最好通過將其值設為
null
來釋放其引用,這個方法叫做接觸引用
哪些情況會造成內存泄漏?如何避免?
以 Vue 為例,通常有這些情況:
監聽在 window/body
等事件沒有解綁
綁在 EventBus
的事件沒有解綁
Vuex
的 $store
,watch
了之后沒有 unwatch
使用第三方庫創建,沒有調用正確的銷毀函數
解決辦法:beforeDestroy
中及時銷毀
綁定了 DOM/BOM
對象中的事件 addEventListener
,removeEventListener
。
觀察者模式 $on
,$off
處理。
如果組件中使用了定時器,應銷毀處理。
如果在 mounted/created
鉤子中使用了第三方庫初始化,對應的銷毀。
使用弱引用 weakMap
、weakSet
。
瀏覽器中不同類型變量的內存都是何時釋放的?
引用類型
在沒有引用之后,通過 V8 自動回收。
基本類型
如果處于閉包的情況下,要等閉包沒有引用才會被 V8 回收。
非閉包的情況下,等待 V8 的新生代切換的時候回收。
關于“瀏覽器中垃圾回收機制的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。