升級JDK17一個不可拒絕的理由!

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:
👉這是一個或許對你有用的開源專案
國產 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=50
上述兩個引數,均已經在生產環境實驗過, 生產環境的機器是單機擁有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

引數釋義


歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢
星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。

文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章