GC 垃圾回收
涉及的技術:
-
標記-清除。第一步,從一些物件出發(這部分通常稱之為root),例如執行緒內的棧,將引用到的物件做標記。此後,通過第二步 清除,遍歷堆中所有的資料,將沒有引用的物件進行回收。
-
引用計數。對於每個物件維護一個引用計數,即自身每被引用一次,就+1,引用消失時,則-1。引用計數到0時,則為垃圾。 設定某種規則,例如垃圾數量達到多少比例之後,觸發回收。
-
拷貝。把一個大的堆,把能夠觸及到的物件拷貝,然後把老的記憶體全部清理。這樣做能夠很好的壓縮記憶體,避免碎片。
-
分代回收。分代回收是基於這樣一個觀點,新產生的物件總是很容易就被棄用。於是將物件按照年齡進行劃分。
各路GC演算法解決的問題:
-
CPU快取命中(如果記憶體分佈太分散,就不能很好的利用CPU的快取),而CPU快取訪問起來比記憶體快多了
-
STW。為了保證GC安全,通常都是將所有執行的執行緒暫停,清理完之後再恢復執行。所以要遍歷的物件越多,STW的時間 就越長。
-
記憶體碎片。物件不斷的被申請和銷燬。久而久之就會產生記憶體碎片。記憶體碎片影響CPU快取,影響CPU資料對齊(不對齊的情況下 會產生更多次數的訪問)。
-
吞吐量。要處理的物件/時間。
目前的GC演算法都不是單純的一種,而往往是上面多種的組合。