5、Hotspot中高效的垃圾回收算法實現
1、枚舉根節點
- 在可達性分析中使用常量或者靜態變量做爲根節點,可是在不少應用中,僅僅方法區就有數百兆,若是逐個檢查會消耗不少時間
- GC停頓:在檢查對象死亡時須要確保一致性,因此在整個分析期間,虛擬機必須停掉全部線程
- Hotspot使用了一種OopMap的數據結構,他能夠知道哪些地方存放着哪些對象引用,不須要在GC停頓的時候進行遍歷,節省時間
2、安全點
- OopMap能夠很高效的完成GC Roots枚舉,可是在實際應用過程當中,致使OopMap結構變化的指令很是多,若是每次變化都產生新的OopMap,那麼GC的空間成本將變得很高
- 因此Hotspot只在安全點(Safepoint)上進行暫停
- 安全點的選擇遵循「是否具備讓程序長時間執行的特徵」,即方法調用、循環跳轉、異常跳轉的纔會產生SafePoint
- 在GC發生時,如何讓全部線程都在安全點上停頓下來呢,有兩種方式,第一是搶先式中斷,第二種是主動式中斷
- 搶先式中斷:就是當GC發生時,若是發現某一線程不在安全點上,則恢復線程讓它跑到安全點上停下來
- 主動式中斷:不直接對線程進行操做,設置一個標誌,各個線程主動輪詢這個標誌,若是標誌爲真(發生GC)則線程暫停(Hotspot使用這種方式)
3、安全區域
- 安全點能夠解決正在執行的線程在GC時停頓的一致性,那麼若是是線程在Sleep狀態,或者Blocked狀態呢
- 這時引入安全區域(SafeRegion)的概念,在線程進入「不執行」狀態時,標記本身進入Safe Region,這樣在GC時,就不用管Safe Region的線程了
- 在線程要離開Safe Region時,須要檢查系統是否已經完成根節點枚舉或者整個GC過程,若是完成了,則線程繼續執行,不然須要等到能夠安全離開Safe Region爲止
歡迎關注本站公眾號,獲取更多信息