前言
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中文網其他相關文章!