v8 引擎GC 垃圾回收機制及演算法
阿新 • • 發佈:2022-03-04
## 描述引用計數的工作原理和優缺點
引用計數演算法的原理是設定一個引用數,判斷當前引用數是否是 0。 程式碼中有一個物件空間,多了一個變數名指向它,引用計數器就為它的引用數 + 1,減 b 少一個引用引用計數器就為它的引用數 - 1, 一旦引用數變為 0, 該物件空間就會被認為是垃圾,然後被回收。
引用計數演算法的優點: 發現了垃圾可以立即回收,一旦引用數為 0 就進行回收。 可以避免程式的暫停,因為一旦程式記憶體將要爆滿的時候,引用計數就會找到垃圾並進行回收。
引用計數演算法的缺點: 無法回收迴圈引用的物件, 由於程式碼自身互相引用所以根據引用計數法的回收條件,是無法被回收的。 時間開銷大,因為引用計數演算法需要維護引用數,一旦發現引用數發生改變需要立即對引用數進行修改。
## 描述標記整理演算法的工作流程
標記-清除演算法會使記憶體產生碎片,那麼如何解決這個問題,很顯然,清除以後再整理一下記憶體不就行了麼。 然而標記-整理演算法不是簡單滴整理一下記憶體。 標記-整理(Mark-Compact)演算法不直接對可回收物件進行清理,而是讓所有可用的物件都向一端移動。然後直接清理掉邊界意外的記憶體。
## 描述 V8 中新生代儲存區垃圾回收的流程
回收過程採用複製演算法 + 標記整理演算法 新生代記憶體區分為兩個等大小的空間 使用空間為 From,空閒空間為 To 標記整理後將活動物件拷貝至 To From 與 To 交換空間完成釋放
回收細節說明 拷貝過程可能出現晉升 晉升就是將新生代物件移動至老生代 一輪 GC 還存活的新生代需要晉升 To 空間的使用率超過 25%(避免後續儲存資料時,空間不足的問題)
## 描述增量標記演算法在何時使用及工作原理
將一整段垃圾回收操作分成幾個小段 垃圾回收與程式執行交替完成 程式執行一段時間後,產生垃圾物件,開始遍歷物件進行標記,第一次標記可能就標記第一層活動物件,第二次標記所有活動物件,最後對空間進行回收。
引用計數演算法的原理是設定一個引用數,判斷當前引用數是否是 0。 程式碼中有一個物件空間,多了一個變數名指向它,引用計數器就為它的引用數 + 1,減 b 少一個引用引用計數器就為它的引用數 - 1, 一旦引用數變為 0, 該物件空間就會被認為是垃圾,然後被回收。
引用計數演算法的優點: 發現了垃圾可以立即回收,一旦引用數為 0 就進行回收。 可以避免程式的暫停,因為一旦程式記憶體將要爆滿的時候,引用計數就會找到垃圾並進行回收。
引用計數演算法的缺點: 無法回收迴圈引用的物件, 由於程式碼自身互相引用所以根據引用計數法的回收條件,是無法被回收的。 時間開銷大,因為引用計數演算法需要維護引用數,一旦發現引用數發生改變需要立即對引用數進行修改。
## 描述標記整理演算法的工作流程
標記-清除演算法會使記憶體產生碎片,那麼如何解決這個問題,很顯然,清除以後再整理一下記憶體不就行了麼。 然而標記-整理演算法不是簡單滴整理一下記憶體。 標記-整理(Mark-Compact)演算法不直接對可回收物件進行清理,而是讓所有可用的物件都向一端移動。然後直接清理掉邊界意外的記憶體。
## 描述 V8 中新生代儲存區垃圾回收的流程
回收過程採用複製演算法 + 標記整理演算法 新生代記憶體區分為兩個等大小的空間 使用空間為 From,空閒空間為 To 標記整理後將活動物件拷貝至 To From 與 To 交換空間完成釋放
回收細節說明 拷貝過程可能出現晉升 晉升就是將新生代物件移動至老生代 一輪 GC 還存活的新生代需要晉升 To 空間的使用率超過 25%(避免後續儲存資料時,空間不足的問題)
## 描述增量標記演算法在何時使用及工作原理
將一整段垃圾回收操作分成幾個小段 垃圾回收與程式執行交替完成 程式執行一段時間後,產生垃圾物件,開始遍歷物件進行標記,第一次標記可能就標記第一層活動物件,第二次標記所有活動物件,最後對空間進行回收。