挑戰前端基礎120題--垃圾回收機制?

1. 什麼是垃圾回收機制?

簡稱GC,內存管理自動運行,找到不被使用的變量,進行垃圾回收 釋放內存;

補充點:JS變量分爲:全局變量 & 局部變量; 全局變量的生命週期是一直存在直到頁面被銷燬。局部變量一般定義在函數內部,他的生命週期從函數被調用開始,直到函數運行結束。等到局部變量不被使用,就會被釋放從而被垃圾回收;

2.爲什麼要進行垃圾回收?

爲了防止內存泄漏,造成程序卡頓和奔潰;一般分爲:意外的全局變量(對象的形式存在),被忘記的定時器或者回調函數,閉包,DOM泄漏;

3.如何實現?

2種實現方案:清除標記法 & 引用計數法

清除標記法:簡單來說 垃圾回收機制會被所有不被使用的變量打上標記,然後回收他的內存;這也是大對數瀏覽器採用的方法;

  • 先找出所有的根結點(全局變量);
  • 運用算法 將所有的根結點 & 他們的字節點 標記爲活躍。任何根結點不能訪問的變量統一標記爲垃圾;
  • 垃圾收集器釋放所有未被標記爲活躍的內存塊,並將這些內存返回給操作系統;

   優點:實現簡單 無非就是標記和不標記

   缺點:1. 內存碎片: 垃圾回收完後 剩餘分配的變量內存空間位置不變,會導致剩餘的內存空間變量不連續。出現內存碎片。

            2.分配新內存緩慢:當有一個新的變量需要分配內存size時,需要遍歷剩餘內存碎片,直到找到合適的size纔會進行分配;有可能需遍歷全部,還不一定能分配上;

後面新出的標記整理算法:和標記清除沒有什麼區別,只是在垃圾回收完後將剩餘的變量 空間統一移動到一側,解決了內存碎片的問題;

引用計數法:是判斷有無引用指向該對象的地址,引用一次+1,等於0的就被回收;

優點:相比清除標記靈活,清除標記需要隔一段時間運行一次。 引用標記只要被標記爲0就會自動被回收。

缺點:對象相互引用的時候(循環引用),即使後來不被使用了 也永遠不會被標記爲0。並且計數的方式需要一個計算器,佔用內存位置。

4.v8引擎對於GC做了什麼優化?

V8爲了優化GC的全暫停時間,還引入了 增量標記 、 併發標記 、 並行標記 、 增量整理 、 並行清理 、 延遲清理 等方式。

我也還在學習中

5.深入:new Map()爲什麼也能被垃圾回收機制回收?

在JavaScript中, Map 對象存儲的是鍵值對,其中鍵和值都可以是任何類型。 然而, Map 並不阻止其鍵(或值)被垃圾回收。 當沒有其他引用指向一個對象時,該對象就可能被垃圾回收機制回收

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章