博客 / 詳情

返回

V8的垃圾回收器

垃圾回收算法

  1. 遍歷 GC Root(window,DOM,棧等)標記活動對象和非活動對象
  2. 回收非活動對象所佔據的內存
  3. 內存整理

新生代和老生代

在 V8 中,會把堆分成新生代和老生代兩個區域

  • 新生代通常只支持 1~8M 的容量,存放生存時間短的對象,由副垃圾回收器負責。
  • 老生代通常容量很大,存放生存時間長的對象,由主垃圾回收器負責。

Scavenge 算法(新生代)

在新生代中被劃分為對象區和空閒區,新加入的對象全部加入對象區,當對象區快被寫滿時,就要進行一次垃圾回收操作。

233526686-e6ff7885-80c1-4fa5-86bf-b3367affc303

回收過程

因為要做頻繁的複製操作,所以新生代一般設置容量較小。

副垃圾回收器還會採用對象晉升策略,移動兩次仍然還存在就把它移動到老生代中去。

233526851-25448ec7-81e2-46c6-af5e-d59afaeed3aa

  1. 垃圾標記
  2. 副垃圾回收器把活動對象複製到空閒區,整理
  3. 兩個區做一次交換,對象區變成空閒區,空閒區變成對象區
  4. 抹掉空閒區

標記算法(老生代)

  • 標記-清除從根開始遍歷,標記那些不能被到達的元素,直接清除掉。會出現內存碎片所以接下來要整理操作。
  • 標記-整理標記活動對象,將它們移動到一端,然後清理掉後面的內存。

垃圾回收器的優化

垃圾回收是運行在主線程上的,所以進行垃圾回收時,會造成卡頓。

  • 並行回收,開多個線程同時進行
  • 增量回收,將垃圾收集分解成更小的顆粒,穿插的進行,一次只進行一小部分操作。
  • 併發回收,在主線程內,輔助線程可以在後台完成垃圾回收操作。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.