1、背景 TLDR
垃圾回收器的暫停問題對即時響應要求較高的服務來說,一直是個痛點, CMS和G1等主流垃圾回收器的數十毫秒乃至上百毫秒的暫停時間相當致命。此外,調優門檻也相對較高,需要對垃圾回收器的內部機制有一定的了解,才能夠進行有效的調優。
隨著ZGC的出現, 使得這一痛點徹底解決, ZGC 最初在 JDK 11 中作為實驗性功能引入,並在 JDK 15 中宣布為生產就緒, 由於 JDK17 才是比較正式提供給大眾實用的LTS支持版本,而且一部份公司已經在使用,所以本文力推 JDK17。
ZGC 作為一款低延遲垃圾收集器,旨在滿足以下目標:
8MB 到 16TB 的堆大小支持
10ms 最大 GC 暫時
最糟糕的情況下吞吐量會降低 15%(實測,如果參數配置的問題可能更糟, 官方這個稍微吹牛了點, 說實話就是用 CPU 換 GC 時間,也沒有那麽高大上)
1.1 升級 JDK17 的不可拒絕的理由
低延遲的業務需求,毫秒級耗時的 GC
據美團的開發說:
在 Zeus 服務不同集群中,ZGC 在低延遲(TP999 < 200ms)場景中收益較大:
TP999:下降 12~142ms,下降振幅 18%~74%。
TP99:下降 5~28ms,下降振幅 10%~47%。
可以忽略的升級 JDK17 的理由:
新版的 Spring Boot 官方最低支持 JDK17,想使用新Spring版本,就得升級;
JIT 編譯器的增強;
JDK 17 中的新功能,例如 Sealed 類、Pattern Matching、Records 等;
升級到 JDK 17 可以獲得更好的安全性,包括修復的漏洞和強化的安全機制。
1.2 適用場景
閘道器服務
Web API
暫不推薦場景:定時任務、批次任務、高 CPU 密集型套用。
2、升級前後對比
話不多說,先看效果。
環境:
CPU:4c
Mem: 6GB
G1 參數:
-Xmx3500m -Xms3500m -XX:+UseG1GC -XX:MaxGCPauseMillis=100
-XX:G1ReservePercent=10 -XX:ConcGCThreads=2 -XX:ParallelGCThreads=5
-XX:G1HeapRegionSize=16m -XX:MaxTenuringThreshold=14
-XX:SurvivorRatio=8
ZGC 參數:
--add-opens=java.base/java.lang=ALL-UNNAMED -Xms3500m -Xmx3500m -XX:ReservedCodeCacheSize=256m -XX:InitialCodeCacheSize=256m -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -XX:ConcGCThreads=1 -XX:ParallelGCThreads=3 -XX:ZCollectionInterval=60 -XX:ZAllocationSpikeTolerance=4 -XX:+UnlockDiagnosticVMOptions -XX:-ZProactive -Xlog:safepoint, classhisto*=trace,age*,gc*=info:file=/opt/gc-%t.log:time,tid,tags:filecount=5,filesize=50m
上述兩個參數,均已經在生產環境實驗過, 生產環境的機器是單機擁有 1500 業務 tps 的機器。
2.1 GC 耗時對比
從上圖可見, GC 耗時是有著質的區別的,這個區別是你用 CMS、Parallel GC、 G1 等嘔心瀝血也調校不出來的。
這麽短的GC, 可以保證,套用因為JVM層面的卡頓都保持在 1ms 以內, 這也是為啥說這點才是不能拒絕的理由。
2.2 CPU 使用對比
從 CPU 使用上看, JDK17 相同的程式碼, 比 JDK8 要高出 10 ~ 20%
3、升級方法
3.1 JDK 選擇或安裝
使用 JDK17 前必須要安裝 JDK17, 對於不同的 Linux 發行版或者作業系統安裝方法各不相同, 下面給出了一些樣例, 僅供參考。
# ubuntu 安裝jdk17
sudo apt install openjdk-17-jdk
# docker 基礎映像
docker pull openjdk:17-slim
docker pull openjdk:17-jdk-oraclelinux7
FROM openjdk:17-slim
3.2 JVM 參數調整
有了 JDK17 後,已經具備了讓你的 Java 程式執行在 JDK17 上的基本條件了,下一步便是配置 JVM 參數如下(有需要的話,可以自行把換行整理下):
--add-opens=java.base/java.lang=ALL-UNNAMED \
-Xms1500m -Xmx1500m \
-XX:ReservedCodeCacheSize=256m \
-XX:InitialCodeCacheSize=256m \
-XX:+UnlockExperimentalVMOptions \
-XX:+UseZGC \
-XX:ConcGCThreads=1 -XX:ParallelGCThreads=2 \
-XX:ZCollectionInterval=30 -XX:ZAllocationSpikeTolerance=5 \
-XX:+UnlockDiagnosticVMOptions -XX:-ZProactive \
-Xlog:safepoint, classhisto*=trace,age*,gc*=info:file=/opt/gc-%t.log:time,tid,tags:filecount=5,filesize=50m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/opt/errorDump.hprof
參數釋義
參考資料
https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html
https://tech.dewu.com/article?id=59
來源: juejin.cn/post/7343440691680870451
>>
END
精品資料,超贊福利,免費領
微信掃碼/長按辨識 添加【技術交流群】
群內每天分享精品學習資料
最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎、並行、JVM、MySQL、Redis、Spring、SpringMVC、SpringBoot、SpringCloud、訊息佇列等多個型別),歡迎您的使用。
👇👇
👇點選"閱讀原文",獲取更多資料(持續更新中)