一個人基於OpenJDK實現GC的concurrent compact部分,以減少GC停頓,困難嗎?

Zing JVM的C4能夠在很大情況下規避大內存下GC停頓,但是是閉源商業產品,Shenandoah也正在完善concurrent compact,性能和穩定性肯定還不如Zing。如果想自己去實現這個功能,主要難點在什麼地方?為什麼開源界到現在還沒有穩定版本? @藍色 @RednaxelaFX @vczh


僅代表個人觀點,不代表公司的任何立場:

在concurrent compacting GC方面,要做出性能好而且穩定的產品的話,是很困難的。無論是個人開發還是團隊開發都是很困難的。技術上的高進入門檻使得鄙司Azul Systems還可以以這個為賣點之一來賣我們的Zing JVM。

舉例來說,Shenandoah GC是Red Hat專門開了個組,請了兩位有豐富GC研發經驗的大大(Roman Kennke 和 Christine Flood)外加一些幫忙的開發和測試,大概從2013年開始開發的東西。然而近4年過去了,它到現在(至少2016年下半年)都還不算很穩定,性能也還沒在各種場景都達到預期的水平。
有別的公司的朋友去年(2016年)測過一下Shenandoah在他們的場景下的性能,說是還遠遠不能行。我不記得他說的是application throughput還是application latency遠遠不行了,但印象中他描述的比我想像的情況更糟糕…
而我們這邊其實也稍微了解過一下Shenandoah的設計與實現狀況。坦白說它的設計有些藏得很深的bug,然而我們的Red Hat同行們似乎一直沒有發現,但我們礙於一些因素不能告訴他們那些具體的問題是什麼…誒。
開發進度不理想不能說是Red Hat公司的錯,也不是Roman和Christine大大經驗不足,而是這就是一件複雜的事情,而且就算有經驗的人也可能一個不小心給自己挖了很深的坑…

可以想像,如果是一個沒有多少經驗的個人,想要基於OpenJDK HotSpot VM實現一個全新的fully concurrent compacting GC,得要是多少人?年的工程。

其實concurrent compacting GC的演算法自身並不是最大的難點。有很多經典的演算法其實都是現成、公開的,其中有些已經有幾十年歷史了。《The Garbage Collection Handbook》一書對相關基礎知識有豐富的介紹,感興趣的同學從那本書開始學習就好。
Azul的C4 GC的演算法其實在公開的論文里已經說得非常清楚,我們在Zing JVM里實際實現的時候也是按照那個演算法來做的,並沒有在演算法層面上隱藏任何東西。論文在公司官網上放著:http://www.azulsystems.com/sites/default/files/images/c4_paper_acm.pdf
但,在讀懂了論文的基礎上,做出一個正確且高效的實現就不那麼容易了。Zing JVM的C4實現的各個部分都經歷過多次演化,不只是GC的核心,還包括(但不限於)JIT編譯器里對它的相關優化等。我自己就見過3個不同版本的LVB(loaded value barrier,C4所使用的read barrier的叫法)的實現,我自己負責了其中一個版本。它們之間的開銷有非常大的差異,可以找出某些benchmark看到application throughput有200%的差異…

而且即便有了正確高效的核心實現,肯定也還要根據各種實際情況而做heuristic tuning。這其實是最最最耗時間的部分(假定很快搞定了實現的正確性問題的話…)。以我們的John Cuthbertson大大的經驗,至少在HotSpot VM上,實現一個新GC並讓它穩定下來,大概需要5年時間。其中大部分時間都會花在跑各種案例測試,並對GC內直接實現的heuristics做調優。CMS GC、G1 GC的研發歷程都大致印證了這個估算。
打個比方說,這種調優就像是說一個演算法的大O也就那樣了,但在具體實現中被大O記法所忽略的常量部分卻是可以大幅改進的,而且許多情況下這個常量部分會直接影響到用戶所感知的性能水平,值得投入大量時間精力去調優。

其實Azul曾經開源過C4的一個實現,現在還可以在GitHub上找到別人存下來的版本:GregBowyer/ManagedRuntimeInitiative
但這個主要是用來演示C4演算法的概念和基本實現,跟後來Zing更優化的實現在細節上還是有諸多不同的。
肯定有同行曾經或正在嘗試藉助這塊代碼來自己實現一個類似C4的東西。但抓不住重點的話,根本無法知道從哪裡下手去優化吧…嗯。

且不說這些領域通常都被很多專利所覆蓋。這方面我不那麼熟就不多說了。


研究性質個人就可以做,發發paper吹吹水,沒問題啊;

真正的產品級開發就得需要一個優秀的團隊了(包括研發、測試、項目管理、產品、市場等等)


從個人工作經歷中發現,一個人想做這樣的事代碼什麼的先不說,光是跑benchmark、案例測試、調優等等工作用的電腦都買不起,你總不能拿你的laptop 跑個數據給大家看吧?


推薦閱讀:

JVM堆內存很富足時,為什麼經常連續發生兩次full GC?
CMS GC發生concurrent mode failure時,為什麼使用單線程的full GC?
JVM full GC的奇怪現象,求解惑?

TAG:Java虛擬機JVM | GC垃圾回收計算機科學 | HotSpotVM | javaGC |