女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JDK11升級JDK17最全實踐

OSC開源社區(qū) ? 來源:京東云開發(fā)者 ? 2023-11-17 10:36 ? 次閱讀

一、前言

2021年9月14日,Oracle發(fā)布了可以長期支持的JDK17版本,那么從JDK11到JDK17,到底帶來了哪些特性呢?亞毫秒級的ZGC效果到底怎么樣呢?值得我們升級嗎?而且升級過程會遇到哪些問題呢?帶著這些問題,本篇文章將帶來完整的JDK11升級JDK17最全實踐。

二、為什么升級JDK17

1)長期支持版本

JDK17是Oracle官方在2021年9月14日發(fā)布的一個長期支持(LTS)版本,意味著它將獲得長期的更新和支持,有助于保持程序的穩(wěn)定性和可靠性。

2)性能提升

更好的垃圾回收器。綜合評估,從Java 8 升級到 Java 11,G1GC平均速度提升16.1%,ParallelGC為4.5%,從Java 11 升級到 Java 17,G1GC平均速度提升8.66%,ParallelGC為6.54%(基于OptaPlanner的用例基準(zhǔn)測試表明)

最大的亮點是帶來了穩(wěn)定版的ZGC垃圾回收器,達(dá)到亞毫秒級停頓。

3)新語法和特性

Switch表達(dá)式簡化、Text Blocks文本塊、instanceof 的模式匹配升級和NullPointerException提示信息改進(jìn)等

4)支持最新的技術(shù)和框架

Spring framework6 和Spring Boot3 都默認(rèn)使用 Java 17作為最低版本

三、升級后壓測效果

先給出結(jié)論:

JDK17相對于JDK8和JDK11,所有垃圾回收器的性能都有很明顯的提升,特別是穩(wěn)定版的ZGC垃圾回收器

不論任何機器配置下,都推薦使用ZGC,ZGC的停頓時間達(dá)到亞毫秒級,吞吐量也比較高

我在JDOS平臺上選擇了不同配置的機器(2C4G、4C8G、8C16G),并分別使用JDK8、JDK11和JDK17進(jìn)行部署和壓測。

整個壓測過程限時60分鐘,用180個虛擬用戶并發(fā)請求一個接口,每次接口請求都創(chuàng)建512Kb的數(shù)據(jù)。最終產(chǎn)出不同GC回收器的各項指標(biāo)數(shù)據(jù),來分析GC的性能提升效果。

以下是壓測的性能情況:

a9a45f7a-84e5-11ee-939d-92fbcf53809c.png

四、OracleJDK 和 OpenJDK 的選擇

2021年9月,Oracle宣布JDK17可以免費商用,直到下一個 LTS 版本之后繼續(xù)提供整整一年,同時Oracle 將繼續(xù)按照自 Java 9 以來的相同版本和時間表提供GPL下的Oracle OpenJDK 版本。

2023年9月,OracleJDK發(fā)布了新的LTS版本 JDK21,這就意味著從2024年9月開始,在生產(chǎn)環(huán)境使用 OracleJDK17 將需要付費。

a9f2b21a-84e5-11ee-939d-92fbcf53809c.png

OracleJDK和OpenJDK這兩個之間沒有真正的技術(shù)差別,因為針對Oracle JDK構(gòu)建過程是基于OpenJDK的。自從JDK11開始,OracleJDK和OpenJDK在功能上基本相同,所以推薦使用 OpenJDK17 或其他開源的JDK版本,這些開源版本都是基于OpenJDK構(gòu)建并提供長期支持的,比如:AdoptOpenJDK、RedHatOpenJDK。?

a9fda170-84e5-11ee-939d-92fbcf53809c.png

五、JDK11到JDK17帶來了哪些新特性

5.1、JVM改進(jìn)

ZGC垃圾回收器從實驗性功能更改為正式產(chǎn)品功能,從JDK11引入以來,經(jīng)過持續(xù)的迭代升級,目前已經(jīng)足夠穩(wěn)定。需要手動開啟,開啟方式:-XX:+UseZGC

G1垃圾回收器仍然作為默認(rèn)垃圾回收器,進(jìn)行改進(jìn)升級,主要包括可中止的混合收集集合、NUMA 可識別內(nèi)存分配等

JDK14開始刪除 CMS 垃圾回收器

JDK14開始棄用 ParallelScavenge 和 SerialOld GC 的組合使用

JDK15禁用偏向鎖,默認(rèn)禁用:-XX:+UseBiasedLocking

NullPointerException 提示信息改進(jìn)

JDK14以前的出現(xiàn)NullPointerException時,只能定位到所在異常行,無法定位具體是哪個變量。改進(jìn)后的NullPointerException,可以清晰描述具體變量,提升了空指針異常的可讀性。

aa01e7f8-84e5-11ee-939d-92fbcf53809c.png

??5.2、新語法特性

5.2.1、Switch表達(dá)式簡化

switch表達(dá)式帶來了簡化式的編碼方式,提供了新的分支切換方式,即 -> 符號,右則表達(dá)式方法體在執(zhí)行完分支方法之后,自動結(jié)束 switch 分支,同時 -> 右則方法塊中可以是表達(dá)式、代碼塊或者是手動拋出的異常

傳統(tǒng)寫法

aa0c7f10-84e5-11ee-939d-92fbcf53809c.png

??新寫法

aa22e372-84e5-11ee-939d-92fbcf53809c.png

??5.2.2、Text Blocks文本塊

通過編寫 """,來減少轉(zhuǎn)義字符和換行符,達(dá)到簡化代碼和提高代碼可讀性的目的

aa38fef0-84e5-11ee-939d-92fbcf53809c.png

??5.2.3、Record類型

record 是 JDK 14 引入的關(guān)鍵字,用于聲明不可變的數(shù)據(jù)類。它適用于存儲純粹的值類型數(shù)據(jù),如接口傳輸數(shù)據(jù)、坐標(biāo)點和只讀的日志記錄。與 lombok 相比,record 簡化了定義純粹數(shù)據(jù)類型的過程。由于 record 類是不可變的,成員變量只能設(shè)置一次且無法更改,無需提供顯式的 setter() 方法。

1、定義Point類,使用關(guān)鍵字record,未定義get/set

aa5046b4-84e5-11ee-939d-92fbcf53809c.png

?2、查看編譯后的字節(jié)碼文件

aa54fb28-84e5-11ee-939d-92fbcf53809c.png

aa7334da-84e5-11ee-939d-92fbcf53809c.png

??3、使用Point類

aa8d19f4-84e5-11ee-939d-92fbcf53809c.png

??5.2.4、instanceof 的模式匹配升級

instanceof類型判斷再也不需要強制轉(zhuǎn)換

參考:https://openjdk.org/jeps/394 aa90f9de-84e5-11ee-939d-92fbcf53809c.png

??5.2.5、密封的類和接口



JDK15開始,引入了sealed普通類或接口類,這些類只允許被指定的類或者interface進(jìn)行擴(kuò)展和實現(xiàn)。 使用修飾符sealed,您可以將一個類聲明為密封類。密封的類使用關(guān)鍵字permits列出可以直接擴(kuò)展它的類。子類可以是最終的,非密封的或密封的 比較實用的一個特性,可以用來限制類的層次結(jié)構(gòu) aaa50cd0-84e5-11ee-939d-92fbcf53809c.png??

5.2.6、其他優(yōu)化和升級


感興趣的同學(xué),推薦閱讀OpenJDK官方文檔說明


六、升級步驟

6.1、JDK選擇


6.2、pom編譯配置升級

maven編譯所需JDK升級至17



    17
    17

6.3、SpringBoot升級

SpringBoot版本升級到2.7.15,Spring版本升級為5.3.29

為什么不升級到SpringBoot3?


Spring Boot 3.0最低要求 Java 17,SpringBoot3.0帶來了很多變化,和SpringBoot2差異較大。考慮到公司很多中間件都是基于SpringBoot2構(gòu)建的,所以此處推薦升級到SpringBoot2的最高版本2.7.15。

POM升級



 org.springframework.boot
 spring-boot-starter-parent
 2.7.15
也可以通過設(shè)置dependencyManagement的方式:


     
    2.7.15
    5.3.29
  



    
        
            org.springframework.boot
            spring-boot-starter-parent
            ${springboot-version}
            import
            pom
        
        
            org.springframework
            spring-framework-bom
            ${springframework.version}
            import
            pom
        
    


循環(huán)依賴問題

SpringBoot升級到2.7.15后,如果應(yīng)用中存在循環(huán)依賴的問題,啟動時會報如下錯誤: aabc25f0-84e5-11ee-939d-92fbcf53809c.png ??


原因:官方文檔不鼓勵循環(huán)依賴引用,默認(rèn)情況下是禁止的


解決方案:

第一種:推薦更新應(yīng)用中bean的依賴關(guān)系來解決 第二種:配置文件中加入以下配置,為了和舊版本保持一致,此配置推薦添加

#放開循環(huán)依賴
spring.main.allow-circular-references=true

6.4、常用中間件升級

6.4.1、Lombok版本升級到1.18.20以上



 org.projectlombok
 lombok
 1.18.20
如果不升級,編譯時會報錯如下:

aad289b2-84e5-11ee-939d-92fbcf53809c.png

?6.4.2、swgger問題,springfox3.0.0和springboot2.7版本不兼容

異常:

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException: 
Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null
解決方案:

/**
 * 增加如下配置可解決Spring Boot 2.7.15 與Swagger 3.0.0 不兼容問題
 **/
@Bean
public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
return new BeanPostProcessor() {


@Override
 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
            }
return bean;
}


private  void customizeSpringfoxHandlerMappings(List mappings) {
            List copy = mappings.stream().filter(mapping -> mapping.getPatternParser() == null).collect(Collectors.toList());
            mappings.clear();
            mappings.addAll(copy);
        }


@SuppressWarnings("unchecked")
private List getHandlerMappings(Object bean) {
try {
                Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                field.setAccessible(true);
return (List) field.get(bean);
            } catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
            }
        }
    };
}
參考:https://developer.aliyun.com/article/950787

6.4.3、AKS升級(針對直接從JDK8升級的情況)

異常

Causedby: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

原因

Java11 刪除了 Java EE modules,其中就包括 java.xml.bind (JAXB)。

解決方案:

手動引入如下包即可


  

      jakarta.xml.bind
      jakarta.xml.bind-api
      2.3.2
 
 

       org.glassfish.jaxb
       jaxb-runtime
       2.3.2

6.4.4、Concrete配置中心阻塞升級

使用 Concrete時,啟動時異常:


Unable to make field private static final java.lang.reflect.Method jdk.proxy2.$Proxy97.m0 accessible: 
 module jdk.proxy2 does not "opens jdk.proxy2" to unnamed module @61d47554
原因:

分析下Concrete報錯的原因,如下圖,包內(nèi)com.wangyin.concrete.spring.ConcreteConfigProcessor#postProcessAfterInitialization(212行)的實現(xiàn)邏輯

aaee0930-84e5-11ee-939d-92fbcf53809c.pngaaf8b7ea-84e5-11ee-939d-92fbcf53809c.png


?解決方案:

在JVM啟動參數(shù)中設(shè)置--add-opens jdk.proxy2來開啟私有字段的訪問,但因為動態(tài)代理生成的包名是隨機不明確的,所以這種方案不可行。JDK官方文檔也明確表示不支持訪問動態(tài)代理內(nèi)部的隨機字段。官方說明:https://cr.openjdk.org/~mr/jigsaw/spec/api/java/lang/reflect/Proxy.html

代碼修改,只需把 f.setAccessible(true) 移到 Modifier.isStatic(f.getModifiers()) 的判斷下方即可。原因是方法 Modifier.isStatic(f.getModifiers()) 本來就要跳過靜態(tài)字段,這樣修改直接避免了訪問。推動concrete團(tuán)隊修復(fù)問題

6.5、JVM啟動參數(shù)配置

6.5.1、開啟ZGC

啟動參數(shù)中配置:-XX:+UseZGC ab25cf8c-84e5-11ee-939d-92fbcf53809c.png

??6.5.2、不同中間件所需啟動參數(shù)

升級JDK17后,項目啟動時可能會遇到如下兩種類型的異常:

cannot access class sun.util.calendar.ZoneInfo (in module java.base) because module java.base does not export sun.util.calendar to unnamed module @0x2611f533

Unable to make field final int java.math.BigInteger.signum accessible: module java.base does not "opens java.math" to unnamed module @525f1e4e

異常原因:

自從JDK9中引入了模塊化功能后,再到JDK17,對于包掃描和反射的權(quán)限控制更加的嚴(yán)格。常見的庫比如(Spring)大量用到包掃描和反射,所以常出現(xiàn)此錯誤。

解決方案:

一個粗暴的解決辦法是將沒開放的module強制對外開放,即保持和Java9之前的版本一致。

--add-exports導(dǎo)出包,意味著其中的所有公共類型和成員都可以在編譯和運行時訪問。

--add-opens打開包,意味著其中的所有類型和成員(不僅是公共類型)都可以在運行時訪問。

主要區(qū)別在于--add-opens允許“深度反射”,即非公共成員的訪問,才可以調(diào)用setAccessible(true) 參考:https://stackoverflow.com/questions/44056405/whats-the-difference-between-add-exports-and-add-opens-in-java-9

SGM需要加入:


--add-opens java.management/java.lang.management=ALL-UNNAMED 
--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED 
--add-opens java.management/sun.management=ALL-UNNAMED
R2M需要加入:

--add-opens java.base/java.time=ALL-UNNAMED
Ducc需要加入:

--add-opens java.base/java.util.concurrent=ALL-UNNAMED
--add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED
--add-opens java.base/java.security=ALL-UNNAMED
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED 
--add-opens java.base/java.net=ALL-UNNAMED 
--add-opens java.base/sun.nio.ch=ALL-UNNAMED
AKS需要加入:

--add-exports java.base/sun.security.action=ALL-UNNAMED
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.math=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/sun.util.calendar=ALL-UNNAMED

6.6、啟動后的驗證

推薦先升級JDK11,再到JDK17,一邊升級一邊進(jìn)行驗證觀察

觀察日志是否有異常,特別是上面說到的啟動時異常

觀察監(jiān)控類軟件,比如SGM、UMP等監(jiān)控是否正常

推薦逐步有序切量,并做好常態(tài)化壓測,防止影響核心業(yè)務(wù)

升級完成后,最好能做個全流程的功能測試,防止功能異常

七、總結(jié)

升級后,除了可以使用新的語法特性,最大的亮點是可以使用亞毫秒級停頓的GC性能(至少百倍的GC性能提升),所以 強烈建議升級到JDK17

整個升級過程并不復(fù)雜,主要涉及到中間件版本的升級和啟動參數(shù)的配置

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8905

    瀏覽量

    153073
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2983

    瀏覽量

    106678
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3551

    瀏覽量

    43360
  • JDK
    JDK
    +關(guān)注

    關(guān)注

    0

    文章

    82

    瀏覽量

    16799

原文標(biāo)題:JDK11升級JDK17最全實踐干貨來了

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    JDK的安裝、環(huán)境配置及使用

    JDK的安裝、環(huán)境配置及使用 JDK的安裝與環(huán)境配置Java是由Sun公司開發(fā)的,從Sun公司的Internet站點可以找到最新版本JDK。以Windows系統(tǒng)為例,JDK的安裝與環(huán)境
    發(fā)表于 12-06 00:19

    樹莓派安裝JDK

    樹莓派安裝JDK更新:2017-03-051、在sun官網(wǎng)下載jdk,我們下載jdk7版本的http://www.oracle.com/technetwork/java/javase
    發(fā)表于 03-05 15:12

    JDK11主要工具

    JDK11的工具的命令參考
    發(fā)表于 08-13 08:21

    樹莓派如何安裝Java JDK?

    是 OpenJDK 11 JDK:  sudo apt update  sudo apt install default-jdk  安裝完成后,通過命令可以檢查 Java 版本進(jìn)行驗證:  java
    發(fā)表于 02-02 16:37

    java jdk6.0官方下載

    java jdk6.0下載如何件: java jdk6.0安裝步驟: 第一步 JDK1.6的安裝步驟 第一步雙擊安裝文件jdk-6u7-windows-i586-p.exe
    發(fā)表于 10-17 11:47 ?155次下載
    java <b class='flag-5'>jdk</b>6.0官方下載

    如何解決JDK8小版本升級后性能下降的問題

    編者按:在升級 JDK8U 的小版本后(從 8u74 升級到 8u202),遇到性能劇烈下降的問題(性能下降 13 倍)。該應(yīng)用是一個非常簡單的 Web 應(yīng)用,且應(yīng)用在 JDK
    的頭像 發(fā)表于 07-26 14:44 ?4398次閱讀
    如何解決<b class='flag-5'>JDK</b>8小版本<b class='flag-5'>升級</b>后性能下降的問題

    畢昇JDK8和JDK11首次同時發(fā)布兩個版本

    2021 年 9 月 30 日,畢昇 JDK update Q3 版本正式發(fā)布,本次發(fā)布將包含 X86_64 版本。此前,畢昇 JDK 只發(fā)布 Aarch64 版本,這可能會對運維產(chǎn)生一定
    的頭像 發(fā)表于 10-28 10:53 ?3613次閱讀
    畢昇<b class='flag-5'>JDK</b>8和<b class='flag-5'>JDK11</b>首次同時發(fā)布兩個版本

    基于JDK 1.8來分析Thread類的源碼

    由上圖我們可以看出,Thread類實現(xiàn)了Runnable接口,而Runnable在JDK 1.8中被@FunctionalInterface注解標(biāo)記為函數(shù)式接口,Runnable接口在JDK 1.8中的源代碼如下所示。
    的頭像 發(fā)表于 02-06 17:12 ?864次閱讀

    weblogic修改jdk路徑

    WebLogic是一個流行的Java應(yīng)用服務(wù)器,可以用于部署和管理企業(yè)Java應(yīng)用程序。在WebLogic的安裝和配置過程中,我們可能會遇到需要修改JDK(Java Development Kit
    的頭像 發(fā)表于 12-05 14:46 ?1631次閱讀

    eclipse配置servers識別不到jdk

    Eclipse是一個廣泛使用的集成開發(fā)環(huán)境(IDE),它可以幫助開發(fā)人員編寫、調(diào)試和測試許多編程語言。在使用Eclipse時,可能會遇到配置servers時無法識別JDK的問題,這會導(dǎo)致項目無法正常
    的頭像 發(fā)表于 12-06 11:41 ?1144次閱讀

    如何在eclipse配置jdk環(huán)境

    在Eclipse中配置JDK環(huán)境非常重要,它是開發(fā)Java程序的基礎(chǔ)。本文將詳細(xì)介紹如何在Eclipse中配置JDK環(huán)境。 下載和安裝JDK 首先,在Oracle官網(wǎng)上下載適用于您的操作系統(tǒng)的
    的頭像 發(fā)表于 12-06 11:49 ?2012次閱讀

    idea的jdk配置在哪

    在開發(fā)Java應(yīng)用程序時,我們通常需要配置Java開發(fā)工具包(JDK),以便能夠在我們的集成開發(fā)環(huán)境(IDE)中編寫和運行Java代碼。本文將詳細(xì)介紹如何在Idea中配置JDK,并提供相關(guān)細(xì)節(jié)的說明
    的頭像 發(fā)表于 12-06 15:04 ?2963次閱讀

    如何配置jdk的環(huán)境變量

    /javase-jdk11-downloads.html)選擇適合您操作系統(tǒng)的JDK版本,并下載它。 第二步:安裝JDK 下載完成后,運行JDK的安裝程序,并按照提示進(jìn)行安裝。選擇一個
    的頭像 發(fā)表于 12-06 15:07 ?1070次閱讀

    JDK11升級JDK17最全實踐干貨來了

    解決你的問題。 上篇文章給大家?guī)砹?b class='flag-5'>JDK8升級JDK11最全實踐,相信大家閱讀后已經(jīng)對JDK11
    的頭像 發(fā)表于 06-25 14:50 ?1112次閱讀
    <b class='flag-5'>JDK11</b><b class='flag-5'>升級</b><b class='flag-5'>JDK17</b><b class='flag-5'>最全</b><b class='flag-5'>實踐</b>干貨來了

    JDK8升級JDK11最全實踐干貨來了

    呢?值得我們升級嗎?而且升級過程會遇到哪些問題呢?帶著這些問題,本篇文章將帶來完整的JDK8升級JDK11
    的頭像 發(fā)表于 06-25 14:51 ?771次閱讀
    <b class='flag-5'>JDK</b>8<b class='flag-5'>升級</b><b class='flag-5'>JDK11</b><b class='flag-5'>最全</b><b class='flag-5'>實踐</b>干貨來了