👉 這是一個或許對你有用的社群
《專案實戰(影片)》:從書中學,往事上“練” 《網際網路高頻面試題》:面朝簡歷學習,春暖花開 《架構 x 系統設計》:摧枯拉朽,掌控面試高頻場景題 《精進 Java 學習指南》:系統學習,網際網路主流技術棧 《必讀 Java 原始碼專欄》:知其然,知其所以然

👉這是一個或許對你有用的開源專案國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、CRM 等等功能:
Boot 倉庫:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 倉庫:https://gitee.com/zhijiantianya/yudao-cloud 影片教程:https://doc.iocoder.cn 【國內首批】支援 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 雙版本

背景 TLDR
垃圾回收器的暫停問題對即時響應要求較高的服務來說,一直是個痛點, CMS和G1等主流垃圾回收器的數十毫秒乃至上百毫秒的暫停時間相當致命。此外,調優門檻也相對較高,需要對垃圾回收器的內部機制有一定的瞭解,才能夠進行有效的調優。隨著ZGC的出現, 使得這一痛點徹底解決, ZGC 最初在 JDK 11 中作為實驗性功能引入,並在 JDK 15 中宣佈為生產就緒, 由於JDK17才是比較正式提供給大眾實用的LTS支援版本,而且一部分公司已經在使用,所以本文力推JDK17。
ZGC 作為一款低延遲垃圾收集器,旨在滿足以下目標:
-
8MB到16TB的堆大小支援 -
10ms最大GC暫時 -
最糟糕的情況下吞吐量會降低15%(實測,如果引數配置的問題可能更糟, 官方這個稍微吹牛了點, 說實話就是用CPU換GC時間,也沒有那麼高大上)
升級JDK17的不可拒絕的理由
低延遲的業務需求,毫秒級耗時的GC
據美團的開發說:
在Zeus服務不同叢集中,ZGC在低延遲(TP999 < 200ms)場景中收益較大:
TP999 :下降12~142ms,下降幅度18%~74%。 TP99 :下降5~28ms,下降幅度10%~47%。
可以忽略的升級JDK17的理由
-
新版的SpringBoot 官方最低支援 JDK17,想使用新Spring版本,就得升級 -
JIT 編譯器的增強 -
JDK 17 中的新功能,例如 Sealed 類、Pattern Matching、Records 等 -
升級到 JDK 17 可以獲得更好的安全性,包括修復的漏洞和強化的安全機制
適用場景
-
閘道器服務 -
Web API
暫不推薦場景:定時任務、批次任務、高CPU密集型應用
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/ruoyi-vue-pro 影片教程:https://doc.iocoder.cn/video/
升級前後對比
話不多說,先看效果
環境:
CPU: 4cMem: 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的機器
GC耗時對比

從上圖可見, GC耗時是有著質的區別的,這個區別是你用CMS、Parallel GC、 G1 等嘔心瀝血也調校不出來的這麼短的GC, 可以保證,應用因為JVM層面的卡頓都保持在1ms 以內, 這也是為啥說這點才是不能拒絕的理由
CPU使用對比

從CPU使用上看, JDK17 相同的程式碼, 比JDK8要高出10 ~ 20%
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/yudao-cloud 影片教程:https://doc.iocoder.cn/video/
升級方法
1. JDK選擇或安裝
使用JDK17前必須要安裝JDK17, 對於不同的Linux發行版或者作業系統安裝方法各不相同, 下面給出了一些樣例, 僅供參考。
# ubuntu 安裝jdk17sudo apt install openjdk-17-jdk# docker 基礎映象docker pull openjdk:17-slimdocker pull openjdk:17-jdk-oraclelinux7Dockerfile複製程式碼FROM openjdk:17-slim
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
引數釋義

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,“長按”或“掃描”下方二維碼噢:

星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。





文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)
關鍵詞
引數
版本
功能
垃圾回收器
許可權