Java 11 新垃圾回收器 ZGC


 可伸縮、低延遲的垃圾回收器

GC 暫停時間不超過 10ms

堆管理容量范圍(小M級別,大到T級別)

對應用吞吐量影響不超過15%(對比 G1)

為進一步的添加新特性和優化做基礎

默認支持 Linux/x64 系統

一、 啟用Linux Large Pages

ZGC 啟用Large Pages 是一種對應用高性能的折中(吞吐量、低延遲及啟動時間),但是卻不會帶來明顯的弊端。除了在應用啟動上需要稍微復雜的配置,所需要的系統相關root權限需要手動進行配置。

Linux Large 在x86 linux平台也稱為 huge pages,頁大小為2M。

假設需要16G大小的JAVA 堆,則意味着需要 16G / 2M = 8192 huge pages。

首先需要分配至少16G(8192 huge pages)內存到 huge pages 內存池。 之所以說至少,是因為如果 JVM 啟用了的 huge pages,那么不僅僅是GC,同時也包括JVM 的其它功能部分也會用到這部分內存(code heap, marking bitmaps 等),因此在此我們分配 9216 pages (18G),保持有2G的額外內存供非堆分配使用。

1. 配置系統的 huge pages 內存池:

$ echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

附注:系統在沒有足夠內存的情境下會導致這一命令執行失敗;命令執行完成需要一定的時間,可以通過以下命令進行查看:

$ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
9216 

2. 掛載 hugetlbfs 文件系統,並分配JVM運行用戶權限:

$ mkdir /hugepages
$ mount -t hugetlbfs -o uid= 123  nodev /hugepages 

附注:對於內核大於等於4.4的linux系統,可以跳過此步驟。

3. JVM啟動命令添加  -XX:+UseLargePages 配置:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages ...

4. 如果掛載了多個 hugetlbfs 文件系統,則需要通過  -XX:ZPath 命令指定需要使用的 hugetlbfs 系統:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages -XX:ZPath=/hugepages ...

附注:huge pages 內存池分配及 hugetlbfs 文件系統掛載是非持久化的,會因系統重啟而丟失,因此需要用戶一定的措施來處理此種情景。

二、啟用 Transparent Huge Pages

... ...

三、啟用 NUMA

ZGC默認支持 NUMA,會優先在NUMA-local 內存進行 JAVA 堆內存分配,但是在有CPU親和性設置的情況下,JVM會自動禁用NUMA,如果需要顯示的設置NUMA支持,可以通過配置以下選項:-XX:+UseNUMA or -XX:-UseNUMA。

對於運行在 NUMA 機器的 JVM ,啟用NUMA,能夠在性能上的到顯著的提升。

四、啟用 GC 日志

啟用命令:

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

幫助信息:

-Xlog:help

基本日志:

-Xlog:gc:gc.log

性能調試:

-Xlog:gc*:gc.log

gc* 代表所有有gc標志的日志。:gc.logd代表日志寫入gc.log文件。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM