ZGC簡介
本次調研目標選取的是jdk11(long-term support)下首次亮相的zgc。
zgc介紹簡單翻譯了zgc main page:ZGC簡介
另外參考hotspot garbage collector team介紹zgc用的ppt:https://archive.fosdem.org/2018/schedule/event/zgc/attachments/slides/2211/export/events/attachments/zgc/slides/2211/ZGC_FOSDEM_2018.pdf
ZGC關鍵字
- region base:區別於G1,zgc支持動態決定region大小,region size schema:small(2m)、medium(32m)、large(2*n m)
- load barrier and color pointer:是zgc在回收的大部分步驟都能並發的原因 (跟其他垃圾回收器的store barrier有點區別,待深入)
- 10ms:STW只遍歷GC root,因此不會隨着heap變大而變慢,這也是為什么STW能維持在10ms以內的原因
- 64位指針:使用64位指針未使用的bit位來記錄元數據,因此不支持指針壓縮,不支持32位平台。目前,42位用於存儲對象地址,4位存gc過程元數據,18位未開發
ZGC gc策略及回收過程相關參數(詳細見:ZGC gc策略及回收過程-源碼分析):
-XX:ZCollectionInterval
固定時間間隔進行gc,默認值為0。
-XX:ZAllocationSpikeTolerance
內存分配速率預估的一個修正因子,默認值為2。一般不需要更改
-XX:ZProactive
是否啟用主動回收策略,默認值為true。一般建議開啟
其他參數分析
本文僅對ZGC相關的參數進行分析,jdk相關參數不在本次研究范圍
1、激活ZGC: -XX:UseZGC
2、配置並發線程數:-XX:ConcGCThreads=<number>
並發線程數,並發線程數太多會導致占用太多cpu時間分片,太少會導致回收速度跟不上垃圾生產速度。如果系統追求的是低時延,盡量不要讓系統超負荷工作,cpu使用率盡量控制在70%以下
3、返還未使用的內存給OS:-XX:ZUncommit
這里指的是設置了xms和xmx且xmx>xms的情況,zgc默認會返回未使用的內存給操作系統,對於內存水位是重要指標的系統,返回未使用內存可以更好的觀察內存使用情況。但如果要禁用這個功能,可以使用:-XX:-ZUncommit 。但無論使用哪種策略,jvm不會uncommit unused memery導致堆大小小於xms。這也意味着如果配置xms=xmx,該特性會被隱式禁用
4、啟用Large Pages:-XX:+UseLargePages -XX:ZPath
Large Pages在Linux稱為Huge Pages,配置zgc使用Huge Pages可以獲得更好的性能(吞吐量、延遲、啟動時間),並且基本沒有缺點,除了配置稍微復雜一點。配置Huge Pages大小,需要注意JVM除了堆以外其他需要使用到的內存也得算進去,一般配合ZPath使用。配置方法可以見:ZGC簡介里的Enbling Large Page
5、啟用NUMA Support:-XX:UseNUMA
zgc默認開啟NUMA支持,意味着在分配堆內存時,會盡量使用NUMA-local的內存(比跨die訪問快3倍)。但當jvm發現程序使用的只是cpu的一個子集(限定使用),則會自動禁用該特性。一般不需要關注這個特性
6、啟用Transparent Huge Page(THP)
一般不建議在對延時敏感的系統下使用,THP一個使管理Huge Pages自動化的抽象層。
7、Relocate時,會根據當前region是否碎片化已大於ZFragmentationLimit,是則回收region,relocate至current candidate relocation set。
-XX:ZFragmentationLimit,默認值25
8、設置打印ZStat統計數據(cpu、內存等log)的間隔 -XX:ZStatisticsInterval
ZGC的不足
目前zgc還是被標記為實驗性質的,說明還不夠成熟,vm參數范圍不斷在調整。實驗性質就是說ZGC在一些大內存的場景中表現了良好的性能,同時也說明ZGC還有一些不足,主要有:
- ZGC僅實現了單代內存管理,也就是說沒有考慮熱點數據與冷數據,這個在商業的C4已經支持。據說Auzl實現的分代內存管理器比沒有分代的內存管理器效率高10倍(並沒有找到相關的資料文獻),也就是說ZGC還有巨大的進步空間;
- C2的支持還不夠完善;
- 不支持Graal, HDSB等功能。
Deprecated
1.Deprecated in jdk12
-XX:ZConcurrentStringTable
-XX:ZConcurrentVMWeakHandles
-XX:ZMarkStacksMax
-XX:ZWeakRoots
-XX:ZOptimizeLoadBarriers
-XX:ZStallOnOutOfMemory
-XX:ZSymbolTableUnloading
2.Deprecated in jdk13
-XX:ZUnmapBadViews
其他
-XX:ZMarkStackSpaceLimit(jdk12才有的參數):Maximum number of bytes allocated for mark stacks
-XX:ZUncommit(jdk13才有的參數):Uncommit unused memory
-XX:ZUncommitDelay (jdk13才有的參數):Uncommit memory if it has been unused for the specified amount of time (in seconds)
資料與工具
jdk jvm參數查詢工具:https://chriswhocodes.com
jdk jvm參數查詢官網:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
jdk11 源碼:https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_src.zip
ZGC與G1一樣都是region-base的垃圾回收器,G1 Paper: https://www.researchgate.net/publication/221032945_Garbage-First_garbage_collection
ZGC的實現參考了C4算法,Azul C4 Paper:https://www.azul.com/files/c4_paper_acm1.pdf
ZGC相關的書:《ZGC的設計與實現》
ZGC簡介:https://wiki.openjdk.java.net/display/zgc/Main
R大博客:https://www.iteye.com/blog/rednaxelafx-362738
jvm調優參考了江南白衣的博客:http://calvin1978.blogcn.com/articles/jvmoption-7.html
其他參考資料:
什么是NUMA架構:http://cenalulu.github.io/linux/numa/
huge pages:https://www.kernel.org/doc/html/latest/admin-guide/mm/hugetlbpage.html
linux memery commit: http://linuxperf.com/?p=102
Memery Barrier:https://mechanical-sympathy.blogspot.com/2011/07/memory-barriersfences.html
什么是JEP、JSR、JLS:https://stackoverflow.com/questions/51282326/what-is-the-difference-or-relation-between-jls-jsr-and-jep