根據OpenJDK的郵件列表,來自Oracle的Per Liden提議將內部開發的Z垃圾收集器開源,并在OpenJDK創建ZGC項目。
按照OpenJDK的指導原則,該項目將會托管不斷開發完善的Z垃圾收集器,也被稱為ZGC。ZGC項目針對低延遲和大規模堆的環境進行了優化。在Oracle內部,ZGC一直處于開發狀態,現在提議將其開源是為了擴大貢獻者和用戶之間的共識。按照Per Liden的說法,ZGC的設計目標:
處理TB量級的堆; GC時間不超過10ms; 相對于使用G1,應用吞吐量的降低不超過15%。在一些著名的業界標準基準測試中,ZGC已經達到或超過該目標了。ZGC是一個并發、基于區域(region)、增量式壓縮的收集器。Stop-The-World階段只會在根對象掃描(root scanning)階段發生,這樣的話GC暫停時間并不會隨著堆和存活對象的數量而增加。
目前,ZGC已經較為成熟和穩定,但是,還有一些工作要做。ZGC在以下GC任務/階段中會并發執行:
標記(Marking) 引用處理(Reference processing) 重新分配集的選擇(Relocation set selection) 重分配/壓縮(Relocation/Compaction)現在,團隊的主要工作是將其他的GC任務/階段也變成并發執行,具體來講就是弱根對象處理(Weak root processing,包括StringTable和JNIWeakGlobalRefs)、類卸載(Class unloading)。
ZGC的核心原則就是組合使用加載屏障(load barrier)與有色對象指針(colored object pointers,colored oops)。正是采用了這兩項技術,ZGC才能做到一些操作的并發執行,比如在Java應用運行的時候,進行對象位置的重新分配。從Java線程的角度來講,加載Java對象中的引用域會受到加載屏障影響。除了對象地址以外,有色對象指針還會包含加載屏障所需的其他信息,用來決定Java線程在使用指針之前是否要采取一些額外的措施。例如,如果對象有可能會被重新分配地址的話,加載屏障會探測到這種情況并采取相應的措施。
Per Liden認為,這種方式相對其他可選方案有一些優勢,比如能夠降低堆內存的損耗、減少和簡化GC屏障以降低運行時的損耗,而且有色對象指針除了包含標記和重分配信息之外,還可以存儲任何類型的信息,這樣加載屏障就能基于這些信息采用相應的措施。
該項目初始代碼會基于JDK 10的倉庫以及最新的ZGC補丁集構建。JDK 10父倉庫的變化將會階段性同步到ZGC中。
來自InfoWorld的觀察認為,該項目可能會與Red Hat的Shenandoah垃圾收集項目產生競爭,因為后者也是以大容量堆的應用為關注對象。