首頁  >  文章  >  web前端  >  秒懂js的垃圾回收機制

秒懂js的垃圾回收機制

hzc
hzc轉載
2020-06-13 09:49:412921瀏覽

前言


js有自動垃圾回收機制,換句話說,執行環境會管理程式碼執行過程中使用的記憶體。

js垃圾回收的原理


執行環境會找出那些不再繼續使用的變量,然後釋放其佔用的記憶體。

js垃圾回收的策略


標記清除

當變數進入環境時,就將這個變量標記為“進入環境”,而當變數離開環境時,則將其標記為“離開環境”。

標記變數方式看具體的實現,例如可以使用一個「進入環境」的變數列表和一個「離開環境」的變數列表來追蹤哪個變數發生了變化。

使用過標記清除的瀏覽器有IE,Firefox,chrome。

引用計數

這是一個不太常見的垃圾回收的策略,它就是追蹤每個值被引用的次數。

當宣告了一個變數a並將一個引用型別值({name:'cc'})賦給該變數時,則這個值的參考次數就是1,如果a({name:'cc '})再賦給另一個變數b,則該值的引用次數加1。反之,如果a賦值{name:'xx'},則{name:'cc'}這個值的引用次數減1。當{name:'cc'}這個值的引用的次數變成0時,則表示沒有辦法再存取{name:'cc'}這個值了,因而可以將其佔用的記憶體空間回收。這樣,當垃圾回收器工作的時候,{name:'cc'}這個值所佔用的記憶體空間就會被回收。

這種方式曾今被Netscape Navigator 3.0使用過,但有一個嚴重問題:循環引用。

function circleReferenceProbem(){
  let objectA = new Object()
  let objectB = new Object()

  objectA.someOtherObject = objectB
  objectB.anotherObject = objectA
}

執行這個函數後,因為這兩個引用值的參考次數永遠不會為0,垃圾回收器永遠不會回收它們所佔用的記憶體空間。

js垃圾回收器的效能


因為js垃圾回收器是每隔一個週期就執行一次垃圾回收。

如果為變數分配的記憶體數量不大的話,那麼垃圾回收器的回收工作量就不大。但是,當垃圾回收器的工作量過大的時候,就很可能會出現卡頓的情況。

js中管理記憶體的建議


  • #盡量少用全域變數

  • 盡可能手動清除變數的引用

謝謝閱讀!

需要加微信交流,可留言!

推薦教學:《JS教學

以上是秒懂js的垃圾回收機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除