ZGC企巢,一個超乎想象的垃圾收集器

Z Garbage Collector浪规,即ZGC探孝,是一個可伸縮的顿颅、低延遲的垃圾收集器,主要為了滿足如下目標進行設計:

  • 停頓時間不會超過10ms
  • 停頓時間不會隨著堆的增大而增大(不管多大的堆都能保持在10ms以下)
  • 可支持幾百M庇配,甚至幾T的堆大小(最大支持4T)

停頓時間在10ms以下耀鸦,10ms其實是一個很保守的數(shù)據(jù)啸澡,在SPECjbb 2015基準測試嗅虏,128G的大堆下最大停頓時間才1.68ms,遠低于10ms吏口,和G1算法相比冰更,也感覺像是在虐菜蜀细。

G1算法通過只回收部分Region奠衔,避免了全堆掃描,改善了大堆下的停頓時間痊夭,但在普通大小的堆里卻表現(xiàn)平平她我,ZGC為什么可以這么優(yōu)秀迫横,主要是因為以下幾個特性矾踱。

Concurrent

ZGC只有短暫的STW,大部分的過程都是和應用線程并發(fā)執(zhí)行禾怠,比如最耗時的并發(fā)標記和并發(fā)移動過程。

Region-based

ZGC中沒有新生代和老年代的概念衡瓶,只有一塊一塊的內存區(qū)域page牲证,以page單位進行對象的分配和回收。

Compacting

每次進行GC時十厢,都會對page進行壓縮操作蛮放,所以完全避免了CMS算法中的碎片化問題包颁。

NUMA-aware

現(xiàn)在多CPU插槽的服務器都是Numa架構压真,比如兩顆CPU插槽(24核),64G內存的服務器岳悟,那其中一顆CPU上的12個核贵少,訪問從屬于它的32G本地內存堆缘,要比訪問另外32G遠端內存要快得多。

ZGC默認支持NUMA架構录平,在創(chuàng)建對象時萄涯,根據(jù)當前線程在哪個CPU執(zhí)行绪氛,優(yōu)先在靠近這個CPU的內存進行分配,這樣可以顯著的提高性能争占,在SPEC JBB 2005 基準測試里獲得40%的提升。

Using colored pointers

和以往的標記算法比較不同伯襟,CMS和G1會在對象的對象頭進行標記姆怪,而ZGC是標記對象的指針稽揭。

其中低42位對象的地址肥卡,42-45位用來做指標標記步鉴。

Using load barriers

因為在標記和移動過程中氛琢,GC線程和應用線程是并發(fā)執(zhí)行的,所以存在這種情況:對象A內部的引用所指的對象B在標記或者移動狀態(tài)册舞,為了保證應用線程拿到的B對象是對的调鲸,那么在讀取B的指針時會經過一個 “l(fā)oad barriers” 讀屏障挽荡,這個屏障可以保證在執(zhí)行GC時定拟,數(shù)據(jù)讀取的正確性青自。

一些變化

JDK11

  • ZGC的最初版本
  • 不支持類卸載class unloading (using -XX:+ClassUnloading has no effect)
    JDK12
  • 進一步減少停頓時間
  • 支持類卸載功能

平臺支持

ZGC目前只在Linux/x64上可用恋腕,如果有足夠的需求,將來可能會增加對其他平臺的支持荠藤。

目前只支持64位的linux系統(tǒng)哈肖,狼哥在mac跑了半天都是下面的錯!


如何編譯

$ hg clone https://wiki.openjdk.java.net/display/hg.openjdk.java.net/jdk/jdk
$ cd jdk
$ sh configure
$ make images

如果正在編譯的版本是 11.0.0, 11.0.1 or 11.0.2,必須加上配置參數(shù)--with-jvm-features=zgc開啟ZGC的編譯币狠,在11.0.3或者12之后,可以忽略這個參數(shù)总寻,已經默認支持器罐。

編譯結束之后,你會得到一個完整的JDK渐行,在Linux中轰坊,可以在下面目錄中找到這個新的JDK

./build/linux-x86_64-normal-server-release/images/jdk

可以進入bin文件夾,執(zhí)行 ./java -version 驗證一下祟印。

如何使用

編譯完成之后肴沫,已經迫不及待的想試試ZGC,需要配置以下JVM參數(shù)蕴忆,才能使用ZGC.

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx10g -Xlog:gc

參數(shù)說明:

Heap Size

通過-Xmx10g進行設置颤芬。
-Xmx是ZGC收集器中最重要的調優(yōu)選項,大大解決了程序員在JVM參數(shù)調優(yōu)上的困擾套鹅。ZGC是一個并發(fā)收集器站蝠,必須要設置一個最大堆的大小,應用需要多大的堆菱魔,主要有下面幾個考量:

  • 對象的分配速率杰妓,要保證在GC的時候桩卵,堆中有足夠的內存分配新對象
  • 一般來說晴叨,給ZGC的內存越多越好件蚕,但是也不能浪費內存,所以要找到一個平衡妄痪。

Concurrent GC Threads

通過-XX:ConcGCThread = 4進行設置土浸。
并發(fā)執(zhí)行的GC線程數(shù)泪酱,如果沒有設置岂津,在JVM啟動的時候會根據(jù)CPU的核數(shù)計算出一個合理的數(shù)量,默認是核數(shù)的12.5%,但是根據(jù)應用的特性茶宵,可以通過手動設置調整种蝶。

因為在并發(fā)標記和并發(fā)移動時透敌,GC線程和應用線程是并發(fā)執(zhí)行的魄藕,所以存在搶占CPU的情況,對于一些對延遲比較敏感的應用,這個并發(fā)線程數(shù)就不能設置的過大,不然會降低應用的吞吐量翻翩,并有可能增加應用的延遲桨仿,因為GC線程占用了太多的CPU骂铁,但是如果設置的太小,就有可能對象的分配速率比垃圾收集的速率來的大操刀,最終導致應用線程停下來等GC線程完成垃圾收集窃蹋,并釋放內存振湾。

一般來說,如果低延遲對應用程序很重要,那么不要這個值不要設置的過于大,理想情況下排嫌,系統(tǒng)的CPU利用率不應該超過70%颇象。

Parallel GC Threads

通過-XX:ParallelGCThreads = 20
當對GC Roots進行標記和移動時阅爽,需要進行STW砰识,這個過程會使用ParallelGCThreads個GC線程進行并行執(zhí)行膨处。

ParallelGCThreads默認為CPU核數(shù)的60%突硝,為什么可以這么大修噪?
因為這個時候,應用線程已經完全停下來了,所以要用盡可能多的線程完成這部分任務,這樣才能讓STW盡可能的短暫。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饱亿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖玄括,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件利虫,死亡現(xiàn)場離奇詭異寞钥,居然都是意外死亡蹄溉,警方通過查閱死者的電腦和手機棉胀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窝剖,“玉大人久又,你說我怎么就攤上這事「涂” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盯质。 經常有香客問我袁串,道長,這世上最難降的妖魔是什么呼巷? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任囱修,我火速辦了婚禮,結果婚禮上朵逝,老公的妹妹穿的比我還像新娘蔚袍。我一直安慰自己,他們只是感情好配名,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晋辆,像睡著了一般渠脉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓶佳,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天芋膘,我揣著相機與錄音,去河邊找鬼霸饲。 笑死为朋,一個胖子當著我的面吹牛,可吹牛的內容都是我干的厚脉。 我是一名探鬼主播习寸,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傻工!你這毒婦竟也來了霞溪?” 一聲冷哼從身側響起孵滞,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸯匹,沒想到半個月后坊饶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡殴蓬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年匿级,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片染厅。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡根蟹,死狀恐怖,靈堂內的尸體忽然破棺而出糟秘,到底是詐尸還是另有隱情简逮,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布尿赚,位于F島的核電站散庶,受9級特大地震影響,放射性物質發(fā)生泄漏凌净。R本人自食惡果不足惜悲龟,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冰寻。 院中可真熱鬧须教,春花似錦、人聲如沸斩芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽划乖。三九已至贬养,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琴庵,已是汗流浹背误算。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迷殿,地道東北人儿礼。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像庆寺,于是被迫代替她去往敵國和親蚊夫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容