為什麼GC(垃圾回收)必須stop-the-world?

haohaoxuexiyai發表於2020-12-04

併發程式設計的許多困難都源於物件生存期問題,當物件線上程之間傳遞時,要確保它們安全地釋放就變得很麻煩。因此GC可以使得併發程式設計變得容易。但是GC也是一個挑戰,但是一次實現,就可以解決人們手動管理記憶體的麻煩(C語言),大大提高的開發效率和避免了許多Bug。

但是GC也是有成本的,他會影響程式的效率,GC是一個非常挑戰的工作,很多電腦科學家在上面耗費了數十年不斷的提升效率。

GC演算法設計時,會考慮幾個重要指標:

(1) 程式吞吐量:GC對程式效率的影響,也就花費在GC的時間和程式處理正常業務的時間比;

(2) GC吞吐量:單位時間內垃圾回收的數量;
(3) 暫停時間:Stop-the-world 的時間;
(4) 併發:垃圾回收機制如何使用多核;
等等還有很多

很多人問為什麼GC的時候要暫停(stop-the-world)整個程式,為什麼不能併發的執行GC呢?GC本質上是一種權衡,Stop-the-world 是為了GC吞吐量(在給定CPU時間內多少垃圾可以被收集器清除?),便不是說GC必須STW,你也可以選擇降低執行速度但是可以併發執行的收集演算法,這取決於你的業務。

比如:你做金融交易類的專案,分秒必爭,那可以選擇並行的方式。如果你是一種後臺任務,比如資料處理,那你可以選擇STW型別演算法,使 GC 的吞吐量得到最高。

兩類演算法最終的權衡指標就GC效率:程式工作時間與執行收集時間的比率。

沒有單一的演算法在所有方面都完美,語言也不可能知道程式的業務型別,這也就是“GC調優”存在的原因。這也是科學的基礎規律。

相關文章