ZGC(Z Garbage Collector)完全指南

ZGC是從JDK11中引入的一種新的支持彈性伸縮低延遲垃圾收集器,ZGC可以工作在KB~TB的內(nèi)存之下冷溃,作為一種并發(fā)的垃圾收集器,ZGC保證應(yīng)用延遲不會超過10毫秒(即便在堆內(nèi)存很大的情況下)梦裂,在JDK11中是以實驗階段的特性被發(fā)布出來的似枕,到JDK13時,ZGC可以支持到16TB的堆內(nèi)存年柠,并且可以將未提交的內(nèi)存歸還給操作系統(tǒng)凿歼。

為什么引入ZGC

JVM的自動垃圾收集雖然減少了開發(fā)人員的工作,在一定程度上減少了內(nèi)存泄漏的風(fēng)險冗恨,但是由于GC是自動進行的答憔,一些無法預(yù)知的事情有時候可能產(chǎn)生對應(yīng)用有害的影響。

  • 延遲增加導(dǎo)致應(yīng)用的吞吐量和性能

隨著時代發(fā)展掀抹,硬件會逐漸便宜虐拓,應(yīng)用使用的內(nèi)存將會越來越大,但是又不能增加延遲渴丸,降低吞吐量

ZGC保證侯嘀,不管在什么情況下另凌,延遲不會超過10毫秒。

The Z Garbage Collector, also known as ZGC, is a scalable low latency garbage collector designed to meet the following goals:

  • Pause times do not exceed 10ms
  • Pause times do not increase with the heap or live-set size
  • Handle heaps ranging from a few hundred megabytes to multi terabytes in size

ZGC特性

ZGC最典型的特性是它是一款并發(fā)(concurrent)的GC戒幔,其它的特性如下:

  • 它可以標(biāo)記內(nèi)存吠谢,復(fù)制和遷移(relocate)內(nèi)存,所有的操作都是并發(fā)的诗茎,同時它有一個并發(fā)的引用處理器
  • 其它的垃圾收集器都是使用store barriers工坊,ZGC使用load barriers,用于跟蹤內(nèi)存
    • lock->unlock->read->load 讀內(nèi)存
    • use->assign->store->write 寫內(nèi)存
  • ZGC可以更加靈活的配置大小和策略敢订,相比于G1王污,它可以更好的處理非常大(very large)對象的釋放
  • ZGC只有一代,沒有新生代楚午,老年代什么的昭齐,但是ZGC可以支持局部壓縮,在內(nèi)存恢復(fù)和遷移(reclaim and relocate)時矾柜,ZGC仍然有很高的性能
  • ZGC依賴NUMA-aware(非均衡存儲器訪問)阱驾,需要我們的內(nèi)存支持這種特點

特性進度表

  • JDK11,2018年 9月
    • ZGC發(fā)布
    • 不支持類的卸載怪蔑。-XX:+ClassUnloading 不生效
  • JDK12 2019年 3月
    • 支持并發(fā)的類卸載
    • 暫停時間進一步縮短
  • JDK13 2019年 9月
    • 最大堆內(nèi)存從4TB -> 16TB
    • 支持歸還未使用的內(nèi)存 uncommitting unused memory
    • 支持Linux與/AArch64平臺
    • 減少時間到一個固定的時間點之下 (Reduced Time-To-Safepoint)
    • 支持 -XX:SoftMaxHeapSize 里覆,當(dāng)設(shè)置這個參數(shù)的時候,ZGC會盡量在指定的內(nèi)存大小之下缆瓣,除非為了避免內(nèi)存溢出:參考:https://bugs.openjdk.java.net/browse/JDK-8222487
  • JDK 14 計劃在2020年3月
    • 增加穩(wěn)定性
    • 支持不連續(xù)的地址空間
    • ...

ZGC支持的平臺:

平臺 是否支持 當(dāng)前進度
Linux/x64 Y Since JDK 11
Linux/AArch64 Y Since JDK 13
macOS In Progress
Windows In Progress

垃圾收集原理

幾個術(shù)語:

  • parallel 多個垃圾收集線程在一起工作喧枷,應(yīng)用可能會停止
  • serial 垃圾收集器只有一個線程在工作
  • stop the world 應(yīng)用程序停止
  • concurrent 垃圾收集器在后臺運行,應(yīng)用程序同時也在運行
  • incremental 在垃圾收集工作結(jié)束之前弓坞,先停止垃圾收集隧甚,等一會再過來完成剩下的工作

ZGC引入了兩個新的概念,pointer coloringload barriers.

Point Coloring

這個特性讓ZGC能夠發(fā)現(xiàn)昼丑,標(biāo)記呻逆,定位和重新映射對象夸赫,它只能工作在64位的操作系統(tǒng)上菩帝,實現(xiàn)colored pointer需要虛擬地址(virtual address masking)。

image-20191107074011335
  • finalizable 對象可以被finalizer到達
  • marked0 和marked1 標(biāo)記可達的對象
  • remap 引用指針到當(dāng)前對象的地址茬腿,對象可能會被relocate呼奢,這個地址表示對象被relocate

Load Barrier

load barrier是一段代碼,當(dāng)線程從堆中加載引用的時候被運行切平。例如握础,當(dāng)我們訪問對象的一個非主要類型的屬性。

在ZGC中悴品,load barrier檢查引用的元數(shù)據(jù)位禀综,根據(jù)元數(shù)據(jù)位對引用的對象做一些處理简烘,因此可能在我們獲取對象的時候?qū)ο蟮囊脮恍薷牡簦遣挥绊懳覀兊氖褂谩?/p>

實戰(zhàn)

可以從jdk官網(wǎng)下載最新版本的JDK定枷,下載地址:

https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html

快速開始

GC日志標(biāo)記格式如下:

-Xlog:<tag set>,[<tag set>, ...]:<log file>

只是想要查看ZGC是否生效:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc

想要查看更加詳細(xì)的ZGC日志信息:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*

將更詳細(xì)的日志信息記錄在文件中:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*:gc.log
img

GC調(diào)參

通用GC選項 ZGC選項 ZGC 診斷選項-XX:+UnlockDiagnosticVMOptions
-XX:MinHeapSize, -Xms -XX:InitialHeapSize, -Xms -XX:MaxHeapSize, -Xmx -XX:SoftMaxHeapSize -XX:SoftRefLRUPolicyMSPerMB -XX:ZAllocationSpikeTolerance -XX:ZCollectionInterval -XX:ZFragmentationLimit -XX:ZMarkStackSpaceLimit -XX:ZPath -XX:ZUncommit -XX:ZUncommitDelay -XX:ZProactive -XX:ZStatisticsInterval -XX:ZVerifyForwarding -XX:ZVerifyMarking -XX:ZVerifyObjects -XX:ZVerifyRoots -XX:ZVerifyViews

是否啟用NUMA支持:

# 啟用NUMA
-XX:+UseNUMA 

# 停用NUMA
-XX:-UseNUMA 

調(diào)整并發(fā)的線程數(shù):

-XX:ConcGCThreads=

返回未提交的內(nèi)存到操作系統(tǒng)孤澎,堆內(nèi)存不會地址設(shè)置的最小堆內(nèi)存-Xms

# 多久未提交的內(nèi)存會返回給系統(tǒng)
-XX:+ZUncommit  -XX:ZUncommitDelay=<seconds>

開啟大分頁,一般會帶來更好的性能提升欠窒,吞吐量覆旭,延遲和啟動時間都有所改善。并沒有看到明顯的缺點

  • 大分頁在Linux系統(tǒng)中一般為2MB的大小岖妄,如果有16G的堆內(nèi)存型将,那么意味著需要16GB/2MB = 8192個大分頁,以下命令需要 Linux kernel >= 4.14
# 配置操作系統(tǒng)中的分頁池數(shù)量
echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

# 查看系統(tǒng)中現(xiàn)在的分頁數(shù)量
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages


-XX:+UseLargePages
  • 如果Linux kernel < 4.14荐虐,那么如下方式
mkdir /hugepages
mount -t hugetlbfs -o uid=123 nodev /hugepages 
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages

開啟透明分頁七兜,透明分頁可能導(dǎo)致延遲上的一些問題,有時候不推薦使用福扬,開啟透明分頁需要Linux kernel < 4.7

# 開啟透明分頁
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo advise > /sys/kernel/mm/transparent_hugepage/shmem_enabled


-XX:+UseTransparentHugePage

最后

ZGC仍然是處于試驗特性階段惊搏,但其保證延遲時間不低于10ms的特性,以及當(dāng)前對堆內(nèi)存大小的支持力度忧换,還是值得一試恬惯,讓我們期待ZGC成為一款更加優(yōu)越的垃圾收集器吧。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亚茬,一起剝皮案震驚了整個濱河市酪耳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刹缝,老刑警劉巖碗暗,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梢夯,居然都是意外死亡言疗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門颂砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噪奄,“玉大人,你說我怎么就攤上這事人乓∏诶海” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵色罚,是天一觀的道長碰缔。 經(jīng)常有香客問我,道長戳护,這世上最難降的妖魔是什么金抡? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任瀑焦,我火速辦了婚禮,結(jié)果婚禮上梗肝,老公的妹妹穿的比我還像新娘何吝。我一直安慰自己帘瞭,他們只是感情好焰宣,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布沃粗。 她就那樣靜靜地躺著,像睡著了一般喘鸟。 火紅的嫁衣襯著肌膚如雪匆绣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天什黑,我揣著相機與錄音崎淳,去河邊找鬼。 笑死愕把,一個胖子當(dāng)著我的面吹牛拣凹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恨豁,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚣镜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了橘蜜?” 一聲冷哼從身側(cè)響起菊匿,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎计福,沒想到半個月后跌捆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡象颖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年佩厚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片说订。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡抄瓦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出克蚂,到底是詐尸還是另有隱情闺鲸,我是刑警寧澤筋讨,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布埃叭,位于F島的核電站,受9級特大地震影響悉罕,放射性物質(zhì)發(fā)生泄漏赤屋。R本人自食惡果不足惜立镶,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望类早。 院中可真熱鬧媚媒,春花似錦、人聲如沸涩僻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆日。三九已至嵌巷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間室抽,已是汗流浹背搪哪。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坪圾,地道東北人晓折。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像兽泄,于是被迫代替她去往敵國和親漓概。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 又是一年秋招季,哎呀媽呀我被虐的慘來~這不飘千,前幾陣失蹤沒更新博客堂鲜,其實是我偷偷把時間用在復(fù)習(xí)課本了(霧 堅持在社區(qū)...
    tengshe789閱讀 2,009評論 0 8
  • ZGC為了支持TB級內(nèi)存,設(shè)計了分頁管理(類似于G1的分區(qū))护奈;為了能夠快速的進行并發(fā)標(biāo)記和并發(fā)移動缔莲,對內(nèi)存空間重新...
    躺在石頭上吐泡泡閱讀 2,990評論 0 7
  • jvm系列之垃圾收集算法 1 標(biāo)記-清除算法 標(biāo)記-清除算法是最基礎(chǔ)的算法,算法分為標(biāo)記和清除兩個階段霉旗,首先標(biāo)記出...
    _muggle閱讀 232評論 0 0
  • 很喜歡的一句話: 跟雨傘學(xué)做人厌秒, 你不為別人擋風(fēng)遮雨读拆, 誰會把你高高舉在頭上!
    愛書的祥瑞閱讀 161評論 0 0
  • 壞情緒通通丟掉鸵闪! 和工作有關(guān)的檐晕,丟掉!不要被工作綁架。 和無關(guān)緊要的人相關(guān)的辟灰,丟掉个榕!這是自找煩惱。 害怕的膽怯的已...
    木子青青閱讀 108評論 0 0