教你怎麼從Java8升級到Java11

目前最新JDK 11,Oracle會一直維護到2026年。html

Java11的新特性

一、更新支持到Unicode 10編碼

Unicode 10(version 10.0 of the Unicode Standard),Unicode是一個不斷在演進的行業標準,Java一直在與它保持一致兼容。java

Java8已經更新了Unicode8.0-9.0,Java10更新後將達到16018個characters、18種blocks和10種scripts。linux

二、將Http Client做爲JDK標準發佈、

原來做爲jdk補充的http類放在jdk.incubator.http包中,如今統一改到java.net.http包下,核心類有下面4個。web

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket
HttpClient client = HttpClient.newBuilder() 
        .version(HttpClient.Version.HTTP_1_1) 
        .connectTimeout(Duration.ofSeconds(3)) 
        .build(); 

HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://www.baidu.com")).build(); 
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); 
System.out.println(response.statusCode());    // 200
System.out.println(response.body());          // 百度頁面的html

三、新增優化不少方法

  • java.util.Collection增長新方法toArray(IntFunction),集合轉數組的不二之選。
  • String增長lines\stripLeading\stripTrailing等,通常項目都有StringUtils類。
  • java.io.InputStream增長構造方法
  • java.nio包下面很大類擴展了方法Channels\XXXBuffer等

推薦一篇博客:Java 11 新增 API 初探,總結的比較細緻。算法

四、支持動態分配 Compiler Threads

JVM啓動參數新增-XX:+UseDynamicNumberOfCompilerThreads,動態的控制編程線程的數量,原來的編譯線程默認會啓動大量形成cpu和memory浪費。編程

五、GC能力大幅提高

低功耗可擴展GC(ZGC)模塊是一個試驗性的併發GC,在線程執行是ZGC會作一些重型回收工做,如string表清理等。執行週期在10ms內,處理heaps大小從MB到TB範圍,目前只能支持linux和x64系統,除此外還有個處理memory分配的Epsilon GZ,有興趣的能夠本身研究。數組

六、堆分析能力提高:JVMTI

提供了一個低負載的堆分配採集分析程序:JVMTI,默認啓動方案能夠持續工做且不形成服務器壓力,面向接口編程,可以收集活着和死去的對象信息。服務器

七、Transport Layer Security 1.3更新

簡稱TLS1.3是網絡傳輸層協議,須要注意的它不兼容歷史版本並且官方認可有風險,但願後續能不斷優化。網絡

八、嵌套訪問控制

嵌套是一種訪問控制上下文,它容許多個class同屬一個邏輯代碼塊,可是被編譯成多個分散的class文件,它們訪問彼此的私有成員無需經過編譯器添加訪問擴展方法。併發

例子:

/** * @author: Owen Jia * @time: 2019/11/7 */
public class NestBasedTest {

    public static class Nest1 {
        private int varNest1;
        public void f() throws Exception {
            final Nest2 nest2 = new Nest2();
            //這裏沒問題
            nest2.varNest2 = 2;
            final Field f2 = Nest2.class.getDeclaredField("varNest2");
            //下面代碼在java 8環境下會報錯,但在java 11中是沒問題的
            f2.setInt(nest2, 1);
            System.out.println(nest2.varNest2);
        }
    }

    public static class Nest2 {
        private int varNest2;
    }

    public static void main(String[] args) throws Exception {
        new Nest1().f();
    }
}

這裏要提一下Class類新增的方法:

// 獲取宿主類。非嵌套類的宿主類是它自己。
public Class<?> getNestHost()
// 判斷該類是不是某個類的嵌套類
public boolean isNestmateOf(Class<?> c)
// 返回某個類的嵌套類數組。第 1 個固定是宿主類,以後的是該宿主類的嵌套成員,但不保證順序,同時也會包含自身
public Class<?>[] getNestMembers()

九、新增和優化諸多加密算法

對PKCS#1 v2.2內提供更多算法,如RSASSA-PSS簽名算法。同時新增ChaCha20和Poly1305密碼算法,經過Cipher.getInstance使用。還有 Curve25519和Curve448被添加。AES128和265也支持了Kerberos 5 encryption。

十、本地參數支持Lambda

簡單理解就是lambda表達式的變量申明能夠用var。

lst.forEach((var x) -> {
		System.out.print(x);
	});

十一、單java文件加載運行

單個的*.java文件能夠直接用java命令來執行,格式:java HelloWorld.java

十二、飛行記錄器分析工具

Jvm啓動參數:-XX:StartFlightRecording

Java11中將這款原來商用的工具集成到jdk標準中了,它是一種低開銷的事件信息收集框架,用來對應用程序和JVM 進行故障檢查、分析,收集應用程序、JVM 和 OS的數據並保存在單獨的事件記錄文件中,故障發生後,可以從事件記錄文件中提取出有用信息對故障進行分析。

更多其餘能力

還有不少其餘更新就不一一介紹了,這些都是JDK標準包支持的基礎能力,得感謝Oracle持續對JDK發佈的支持。完整的jdk11變化清單能夠去官網查看;

從11開始移除的模塊清單

  • Removal of com.sun.awt.AWTUtilities Class
  • Removal of Lucida Fonts from Oracle JDK
  • Removal of appletviewer Launcher
  • Oracle JDK’s javax.imageio JPEG Plugin No Longer Supports Images with alpha
  • Removal of sun.misc.Unsafe.defineClass
  • Removal of Thread.destroy() and Thread.stop(Throwable) Methods
  • Removal of sun.nio.ch.disableSystemWideOverlappingFileLockCheck Property
  • Removal of sun.locale.formatasdefault Property
  • Removal of JVM-MANAGEMENT-MIB.mib
  • Removal of SNMP Agent
  • Remove the Java EE and CORBA Modules
  • Removal of JavaFX from the Oracle JDK
  • Removal of JMC from the Oracle JDK
  • Removal of Java Deployment Technologies
  • 更多請查看官網

升級建議(重要)

從Java 11後Oracle再也不單獨發佈JRE和Server JRE了,並統一JDK名稱爲:Oracle JDK

另外Java 11及以後的版本,將不會再發布對32位操做系統支持的版本。

新舊項目不一樣策略

新啓的Java項目建議直接從Oracle JDK 11開始搭建,千萬不要猶豫,由於技術都是越新越強的。Java8就像晚期的大衆,而Java11倒是新興的特斯拉。

歷史的項目若是隻是維護的話,乾脆就放着運行不要動好了,等哪天決定重構了再考慮升級到Java11。由於最大的問題不是本身公司開發的Code不能遷移到高版本,而是項目中引入的第三方Jar,這個東西搞起來十分頭疼。

JDK升級分析工具

升級最擔憂的就是被刪除的模塊!

推薦IBM公司Liberty團隊提供了一個十分好用的檢測Toolkit程序,能夠掃描應用程序二進制文件(.war),發現的任何潛在的Java 11問題並生成Html報告。絕對的大利器,詳細內容直接查看IBM官方介紹:Scanner Kit

直接運行java -jar binaryAppScannerInstaller.jar,按步驟安裝有個lisence聲明和目錄指定,默認目錄名wamt

wamt

參考文檔中會有使用詳細介紹,也能夠參考下面測試例子(掃描很慢,要些耐心等):

java -jar binaryAppScanner.jar Root.war --analyzeJavaSE --sourceJava=oracle8 --targetJava=java11 --output=./java11/RootReport.html

查看幫助命令:

java -jar binaryAppScanner.jar Root.war --help --all

scanner

報告結果以下:

1

2

3

4

5

JDK不一樣於OpenJDK

推薦Oracle JDK,由於更加穩定可靠。

  • 只有Oracle JDK支持Solaris系統;
  • 只有Oracle JDK才支持msi這樣的安裝程序;
  • Oracle JDK版本將每三年發佈一次,而OpenJDK版本每三個月發佈一次;
  • OpenJDK 是一個參考模型而且是徹底開源的,而Oracle JDK是 OpenJDK的一個實現,並非徹底開源的;
  • Oracle JDK 比 OpenJDK 更穩定。OpenJDK和Oracle JDK的代碼幾乎相同,但建議您選擇Oracle JDK,由於它通過了完全的測試和穩定修復;
  • 在響應性和JVM性能方面,Oracle JDK與OpenJDK相比提供了更好的性能;
  • Oracle JDK不會爲即將發佈的版本提供長期支持,用戶每次都必須經過更新到最新版本得到支持來獲取最新版本;
  • Oracle JDK根據二進制代碼許可協議得到許可,而OpenJDK根據GPL v2許可得到許可。Oracle公司很善於打官司,因此這點很重要。

20191107

相關連接

JDK 11 Documentation Home

Java SE Development Kit 11 Downloads

java 11 release docs list

JDK 6~13 Release List


做者:Owen Jia

關注做者博客:https://blog.shareworld.vip