ZGC是從JDK11中引入的一種新的支持彈性伸縮和低延遲垃圾收集器,ZGC能夠工做在KB~TB的內存之下,做爲一種併發的垃圾收集器,ZGC保證應用延遲不會超過10毫秒(即使在堆內存很大的狀況下),在JDK11中是以實驗階段的特性被髮布出來的,到JDK13時,ZGC能夠支持到16TB的堆內存,而且能夠將未提交的內存歸還給操做系統。html
JVM的自動垃圾收集雖然減小了開發人員的工做,在必定程度上減小了內存泄漏的風險,可是因爲GC是自動進行的,一些沒法預知的事情有時候可能產生對應用有害的影響。java
隨着時代發展,硬件會逐漸便宜,應用使用的內存將會愈來愈大,可是又不能增長延遲,下降吞吐量node
ZGC保證,無論在什麼狀況下,延遲不會超過10毫秒。bash
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最典型的特性是它是一款併發(concurrent)的GC,其它的特性以下:oracle
store barriers
,ZGC使用load barriers
,用於跟蹤內存
ZGC支持的平臺:jvm
平臺 | 是否支持 | 當前進度 |
---|---|---|
Linux/x64 | Y | Since JDK 11 |
Linux/AArch64 | Y | Since JDK 13 |
macOS | In Progress | |
Windows | In Progress |
幾個術語:性能
ZGC引入了兩個新的概念,pointer coloring和load barriers.ui
這個特性讓ZGC可以發現,標記,定位和從新映射對象,它只能工做在64位的操做系統上,實現colored pointer須要虛擬地址(virtual address masking)。spa
load barrier是一段代碼,當線程從堆中加載引用的時候被運行。例如,當咱們訪問對象的一個非主要類型的屬性。
在ZGC中,load barrier檢查引用的元數據位,根據元數據位對引用的對象作一些處理,所以可能在咱們獲取對象的時候對象的引用會被修改掉,可是不影響咱們的使用。
能夠從jdk官網下載最新版本的JDK,下載地址:
GC日誌標記格式以下:
-Xlog:<tag set>,[<tag set>, ...]:<log file>
複製代碼
只是想要查看ZGC是否生效:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc
複製代碼
想要查看更加詳細的ZGC日誌信息:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*
複製代碼
將更詳細的日誌信息記錄在文件中:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*:gc.log
複製代碼
通用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
複製代碼
調整併發的線程數:
-XX:ConcGCThreads=
複製代碼
返回未提交的內存到操做系統,堆內存不會地址設置的最小堆內存-Xms
# 多久未提交的內存會返回給系統
-XX:+ZUncommit -XX:ZUncommitDelay=<seconds>
複製代碼
開啓大分頁,通常會帶來更好的性能提高,吞吐量,延遲和啓動時間都有所改善。並無看到明顯的缺點
# 配置操做系統中的分頁池數量
echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# 查看系統中如今的分頁數量
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
-XX:+UseLargePages
複製代碼
mkdir /hugepages
mount -t hugetlbfs -o uid=123 nodev /hugepages
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages
複製代碼
開啓透明分頁,透明分頁可能致使延遲上的一些問題,有時候不推薦使用,開啓透明分頁須要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的特性,以及當前對堆內存大小的支持力度,仍是值得一試,讓咱們期待ZGC成爲一款更加優越的垃圾收集器吧。