奇技 · 指南
為什么選擇Java11?
容器環境支持,GC等領域的增強,僅通過切換到 Java 11 就有 16% 的改進。
進行了瘦身,更輕量級,安裝包體積小。
JDK11 是一個長期支持版。
1Java11相對于Java8的一些新特性
1.變量類型推斷
Var關鍵字:新版Java引入全新的類型關鍵字var,用var來定義的變量像python一樣不用寫具體類型,編譯器能根據實際賦值來自動推斷變量的類型
2.普通局部變量
3.For循環中使用
4.Var結合泛型
注意:var不能在類成員變量類型和方法返回值類型使用
5.增強api
6.String 增強
新版本增加了一些更方便的字符串處理的API
7.集合增強
增加了一些更加方便的創建和復制集合類型的API
● of() @since 9
● copyOf() @since 10
8.Stream增強
Java 8 中的流已經很強大了,而且只要涉及到 IO,只要涉及到對一系列數據進行操作,都會用到流。當然了,Java 9對其操作繼續增強,這次的改進主要是如何設置停止流的條件上。為此在流的實例上提供了四個方法 takeWhile(Predicate Interface) 、iterate 、ofNullable 和 dropWhile(Predicate Interface)
2
HTTP Client API
新版jdk官方自帶httpClient,支持發送同步、異步的http請求完全支持Linux容器(包括docker)
許多運行在Java虛擬機中的應用程序(包括Apache Spark和Kafka等數據服務以及傳統的企業應用程序)都可以在Docker容器中運行。但是在Docker容器中運行Java應用程序一直存在一個問題,那就是在容器中運行JVM程序在設置內存大小和CPU使用率后,會導致應用程序的性能下降。這是因為Java應用程序沒有意識到它正在容器中運行。隨著Java 10的發布,這個問題總算得以解決,JVM現在可以識別由容器控制組(cgroups)設置的約束。可以在容器中使用內存和CPU約束來直接管理Java應用程序,其中包括:
● 遵守容器中設置的內存限制
● 在容器中設置可用的CPU
● 在容器中設置CPU約束
3
升級過程中遇到的一些問題
1. javax.xml.bind 不存在
Java11 刪除了 Java EE modules,其中就包括 java.xml.bind (JAXB)。
啟動時警告:
解決方案:手動添加相關依賴
<dependency><groupId>javax.xml.bindgroupId><artifactId>jaxb-apiartifactId><version>2.3.0version>dependency><dependency><groupId>com.sun.xml.bindgroupId><artifactId>jaxb-coreartifactId><version>2.3.0version>dependency><dependency><groupId>com.sun.xml.bindgroupId><artifactId>jaxb-implartifactId><version>2.3.0version>dependency>
2. 編譯報錯由于JDK11中刪除了sum.misc包,編譯時會報錯:sun.misc.BASE64Encoder、sun.misc.BASE64Decoder找不到類
解決方式:使用java.util.Base64.Encoderjava.util.Base64.Decoder替換
3.服務啟動報錯
① JDK11下使用最新的Greenwich版本的eureka默認情況下必定無法啟動,日志提示內嵌的Tomcat沒法啟動
解決方式:加入JAXB依賴
<dependency><groupId>org.glassfish.jaxbgroupId><artifactId>jaxb-runtimeartifactId><version>2.3.2version>dependency>
②?JDK9以后的版本,模塊化的概念去除了JAXB(默認沒有加載),需做接入聲明解決方式:加入JAXB依賴
<dependency>
?<groupId>javax.xml.bindgroupId>
????????<artifactId>jaxb-apiartifactId>
dependency>
?<dependency>
?????????<groupId>com.sun.xml.bindgroupId>
?????????<artifactId>jaxb-implartifactId>
?????????<version>2.3.0version>
?dependency>
?<dependency>
????????<groupId>org.glassfish.jaxbgroupId>
????????<artifactId>jaxb-runtimeartifactId>
????????<version>2.3.0version>
dependency>
?<dependency>
?????????<groupId>javax.activationgroupId>
?????????<artifactId>activationartifactId>
??????????<version>1.1.1version>
dependency>
4
趨勢
從Java 11開始,OpenJDK major version的發布間隔差不多是半年,不用全部都要去關注,都是追趕,但是LTS版本,需要去追趕,去升級,Java11就是最新的LTS版本,下一個或者再一下major version,很可能又是一個LTS版本;雖然目前使用Java 8都挺好的,現實是Java 8的一些特性會被往后移植,但是后續版本的特性和優化不會再被集成到Java 8中了。
往期精彩回顧MongoDB通配符索引
實習招聘|360云平臺火熱招聘中
360Stack裸金屬服務器部署實踐


360技術公眾號
技術干貨|一手資訊|精彩活動
掃碼關注我們