當前位置: 妍妍網 > 碼農

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

2024-05-28碼農

來源:juejin.cn/post/7343440691680870451

👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 每月贈書

新計畫: 仿小紅書 (微服務架構)正在更新中... , 全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 http://116.62.199.48/ 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了261小節,累計43w+字,講解圖:1806張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,

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

    好書推薦

    凝聚作者18年芯片一線封裝測試工作經驗,從零開始全流程講解芯片封裝測試原理

    量化金融新範式:引領演算法交易與智慧決策,助力讀者開啟了一個全新的量化金融大門。

    👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 每月贈書

    新計畫: 仿小紅書 (微服務架構)正在更新中... , 全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 http://116.62.199.48/ 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了261小節,累計43w+字,講解圖:1806張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,


    1. 

    2. 

    3. 

    4. 

    最近面試BAT,整理一份面試資料Java面試BATJ通關手冊,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。

    獲取方式:點「在看」,關註公眾號並回復 Java 領取,更多內容陸續奉上。

    PS:因公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下在看,加個星標,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。

    「在看」支持小哈呀,謝謝啦