[譯]ZGC: 一個可伸縮的低延遲垃圾收集器[精品短文]

願我所遇之人,所歷之事,哪怕由於我有一點點變好,我就心滿意足了。java

翻譯自:JEP 333git

地址:openjdk.java.net/jeps/333github

1、摘要

Z垃圾收集器,也稱爲ZGC,是一個可伸縮的低延遲垃圾收集器。算法

2、目標

  • GC暫停時間不超過10ms
  • 能處理大小從相對較小(幾百MB)到很是大(TB級)的堆
  • 與使用G1相比,應用程序吞吐量減小不超過15%
  • 方便往後在此基礎上利用彩色指針和內存屏障進一步優化收集器及實現新特性。【原文:Lay a foundation for future GC features and optimizations leveraging colored pointers and load barriers】
  • 支持平臺:Linux/x64

注:此處及下文中的內存屏障即load barrier,在ZGC中用的是讀屏障。bash

3、動機

垃圾收集是Java的主要優點之一。可是,當垃圾收集暫停太長時,就會對應用程序的響應時間產生負面影響。經過大幅度縮短停頓時間,咱們可讓Java適用於更多類型的應用程序。微信

此外,現代系統中可用的內存數量還在繼續增加。用戶和應用程序開發人員但願JVM可以以一種有效的方式充分利用這種內存,而且不會出現很長的GC暫停時間。併發

4、 描述

ZGC是一個併發的、單代(再也不區分新生代和老年代)的、基於region的、支持numa的壓縮收集器。Stop-the-world階段僅限於根掃描,因此GC暫停時間不會隨着堆或存活對象的多少而增長。less

ZGC的一個核心設計原則是結合使用內存屏障和彩色對象指針。這使得ZGC可以在運行Java應用程序線程時執行併發操做,好比對象重定位。從Java線程的角度來看,在Java對象中加載引用字段的行爲受到內存屏障的限制。除了對象地址以外,有色對象指針還包含內存屏障須要的信息,用於肯定在容許Java線程使用該指針以前是否須要採起某些操做。例如,對象可能已經被從新定位,在這種狀況下,內存屏障將檢測狀況並採起適當的操做。jvm

與其餘技術相比,咱們認爲顏色指針方案提供了一些很是吸引人的特性。特別是:ide

  • 這容許咱們在移動對象/整理內存階段,在指向可回收/重用區域的指針肯定以前回收/重用這部份內存【原文:It allows us to reclaim and reuse memory during the relocation/compaction phase, before pointers pointing into the reclaimed/reused regions have been fixed. 】。這有助於下降堆開銷。這還意味着不須要實現單獨的標記壓縮算法來處理完整的GC。

  • 這容許咱們使用相對較少且簡單的GC屏障。這有助於下降運行時開銷。這還意味着在解釋器和JIT編譯器中更容易實現、優化和維護GC barrier代碼。

  • 咱們目前將標記和從新定位相關信息存儲在彩色指針中。然而,此方案的通用性容許咱們存儲任何類型的信息(只要咱們能將其放入指針中),並容許內存屏障根據該信息採起它想要採起的任何操做。咱們相信這將爲未來的許多特性打下基礎。舉一個例子,在異構內存環境中,這能夠用來跟蹤堆訪問模式,以指導GC從新定位決策,將不多使用的對象移動到冷存儲(不常訪問的內存區域)中【原文:To pick one example, in a heterogeneous memory environment, this could be used to track heap access patterns to guide GC relocation decisions to move rarely used objects to cold storage.】。

5、性能

咱們已經使用SPECjbb 2015[1]作了常規性能測試。從吞吐量和延遲角度來看,性能都很好。下面是使用128G堆在複合模式下比較ZGC和G1的典型基準分數(以百分比爲單位,根據ZGC的max-jOPS進行標準化)【原文:Below are typical benchmark scores (in percent, normalized against ZGC’s max-jOPS), comparing ZGC and G1, in composite mode using a 128G heap.】:

越高越好

ZGC
       max-jOPS: 100%
  critical-jOPS: 76.1%

G1
       max-jOPS: 91.2%
  critical-jOPS: 54.7%
複製代碼

下面是來自相同基準測試的GC暫停時間。ZGC設法保持遠低於10ms的目標。注意,確切的數字可能會根據使用的機器和設置而變化(上下都有,但不是很明顯)。

越低越好

ZGC
                avg: 1.091ms (+/-0.215ms)
    95th percentile: 1.380ms
    99th percentile: 1.512ms
  99.9th percentile: 1.663ms
 99.99th percentile: 1.681ms
                max: 1.681ms

G1
                avg: 156.806ms (+/-71.126ms)
    95th percentile: 316.672ms
    99th percentile: 428.095ms
  99.9th percentile: 543.846ms
 99.99th percentile: 543.846ms
                max: 543.846ms
複製代碼

咱們還對其餘各類SPEC®基準測試和內部工做負載進行了特別的性能測量。通常狀況下,ZGC可以維護個位數的毫秒暫停時間。

6、 侷限性

ZGC的初始實驗版本將不支持類卸載。默認狀況下,classunload和ClassUnloadingWithConcurrentMark選項將被禁用。即使你啓用也是不生效的。

此外,ZGC最初不支持JVMCI(即Graal)。若是啓用EnableJVMCI選項,將打印一條錯誤消息。

這些限制將在本項目的後期解決。

7、 構建和使用

按照慣例,構建系統默認禁用JVM中的實驗性特性。ZGC是一個實驗性特性,所以不會出如今JDK構建中,除非在編譯時使用configure選項:

--with-jvm-features=zgc
複製代碼

顯式地啓用它。

(ZGC將出如今Oracle發佈的全部Linux/x64 JDK版本中)

JVM中的實驗特性還須要在運行時顯式地解鎖。所以,要啓用/使用ZGC,須要如下JVM選項:

-XX:+ unlockexperimental alvmoptions -XX:+UseZGC
複製代碼

有關如何設置和調優ZGC的更多信息,請參閱ZGC項目Wiki(wiki地址:wiki.openjdk.java.net/display/zgc…

ZGC paper能夠參考Azul Pauseless GC Algorithm:

github.com/jiankunking…

ZGC 簡介PPT:

github.com/jiankunking…

8、博主信息

我的微信公衆號:

我的博客

我的github

我的掘金博客

我的CSDN博客

相關文章
相關標籤/搜索