zgc是一款可拓展的低時延,為實現以下幾個目標而誕生的垃圾回收器:
- 停頓時間不超過10ms
- 停頓時間不會因堆變大而變長
- 堆大小范圍可支持幾G到幾T
再看一下zgc的標簽:
- region-based (和G1一樣)
- NUMA-aware
- Concurrent
- Compacting
- Using load barriers(讓一個CPU處理單元中的內存狀態對其它處理單元可見的一項技術,java的volatile底層使用的就是load barrier)
- Using colored pointers()
zgc介紹-by hotspot garbage collector team:https://archive.fosdem.org/2018/schedule/event/zgc/attachments/slides/2211/export/events/attachments/zgc/slides/2211/ZGC_FOSDEM_2018.pdf
一、zgc在jdk各個版本的changelog:
JDK 13 (Released September 2019)
- Increased max heap size from 4TB to 16TB
- Support for uncommitting unused memory (JEP 351)
- Support for -XX:SoftMaxHeapSIze
- Support for the Linux/AArch64 platform
- Reduced Time-To-Safepoint
JDK 12 (Released March 2019)
- Support for concurrent class unloading
- Further pause time reductions
JDK 11 (Released September 2018)
- Initial version of ZGC
- Does not support class unloading (using -XX:+ClassUnloading has no effect)
二、ZGC相關VM Options
General GC Options | ZGC Options | ZGC Dianostic Options (-XX:+UnlockDianosticVMOptions) |
---|---|---|
|
|
|
1、激活ZGC
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
2、設置堆大小,堆
-Xmx<size>
3、並發線程數,並發線程數太多會導致占用太多cpu時間分片,太少會導致回收速度跟不上垃圾生產速度。如果系統追求的是低時延,盡量不要讓系統超負荷工作,cpu使用率盡量控制在70%以下
-XX:ConcGCThreads=<number>
4、return unused memery to os
這里指的是設置了xms和xmx且xmx>xms的情況,zgc默認會返回未使用的內存給操作系統,對於內存水位是重要指標的系統,返回未使用內存可以更好的觀察內存使用情況。但如果要禁用這個功能,可以使用:-XX:-ZUncommit 。但無論使用哪種策略,jvm不會uncommit unsed memery導致堆大小小於xms。這也意味着如果配置xms=xmx,該特性會被隱式禁用
5、Enable Large Pages
啟用方式:-XX:+UseLargePages
Large Pages在Linux稱為Huge Pages,配置zgc使用Huge Pages可以獲得更好的性能(吞吐量、延遲、啟動時間),並且基本沒有缺點,除了配置稍微復雜一點。配置Huge Pages大小,需要注意JVM除了堆以外其他需要使用到的內存也得算進去,具體配置方法如下,就不翻譯了:
6、 Enable Transparent Huge Page(THP)
一般不建議在對延時敏感的系統下使用,THP一個使管理Huge Pages自動化的抽象層。
7、Enable NUMA Support
zgc默認開啟NUMA支持,意味着在分配堆內存時,會盡量使用NUMA-local的內存(比跨die訪問快3倍)。但當jvm發現程序使用的只是cpu的一個子集(限定使用),則會自動禁用該特性。一般不需要關注這個特性,如果需要指定,可以通過以下參數指定
-XX:+/-UseNUMA
8、Enable GC logging