作者:Owen_Jia
來源:https://my.oschina.net/timestorm/blog/3127044
目前最新JDK 11,Oracle會一直維護到2026年。
JAVA11的新特性
1、更新支持到Unicode 10編碼
Unicode 10(version 10.0 of the Unicode Standard),Unicode是一個不斷在演進的行業標準,Java一直在與它保持一致兼容。
Java8已經更新了Unicode8.0-9.0,Java10更新后將達到16018個characters、18種blocks和10種scripts。
2、將Http Client作為JDK標準發布、
原來作為jdk補充的http類放在jdk.incubator.http包中,現在統一改到java.net.http包下,核心類有下面4個。
- HttpClient
- HttpRequest
- HttpResponse
- WebSocket

3、新增優化很多方法
- java.util.Collection增加新方法toArray(IntFunction),集合轉數組的不二之選。
- String增加linesstripLeadingstripTrailing等,一般項目都有StringUtils類。
- java.io.InputStream增加構造方法
- java.nio包下面很大類擴展了方法ChannelsXXXBuffer等
推薦一篇博客:Java 11 新增 API 初探,總結的比較細致。
4、支持動態分配 Compiler Threads
JVM啟動參數新增-XX:+UseDynamicNumberOfCompilerThreads,動態的控制編程線程的數量,原來的編譯線程默認會啟動大量造成cpu和memory浪費。
5、GC能力大幅提升
低功耗可擴展GC(ZGC)模塊是一個試驗性的并發GC,在線程執行是ZGC會做一些重型回收工作,如string表清理等。執行周期在10ms內,處理heaps大小從MB到TB范圍,目前只能支持linux和x64系統,除此外還有個處理memory分配的Epsilon GZ,有興趣的可以自己研究。
6、堆分析能力提升:JVMTI
提供了一個低負載的堆分配采集分析程序:JVMTI,默認啟動方案可以持續工作且不造成服務器壓力,面向接口編程,能夠收集活著和死去的對象信息。
7、Transport Layer Security 1.3更新
簡稱TLS1.3是網絡傳輸層協議,需要注意的它不兼容歷史版本而且官方承認有風險,希望后續能不斷優化。
8、嵌套訪問控制
嵌套是一種訪問控制上下文,它允許多個class同屬一個邏輯代碼塊,但是被編譯成多個分散的class文件,它們訪問彼此的私有成員無需通過編譯器添加訪問擴展方法。
例子:

這里要提一下Class類新增的方法:
// 獲取宿主類。非嵌套類的宿主類是它本身。 public Class<?> getNestHost() // 判斷該類是否是某個類的嵌套類 public boolean isNestmateOf(Class<?> c) // 返回某個類的嵌套類數組。第 1 個固定是宿主類,之后的是該宿主類的嵌套成員,但不保證順序,同時也會包含自身 public Class<?>[] getNestMembers()
9、新增和優化諸多加密算法
對PKCS#1 v2.2內提供更多算法,如RSASSA-PSS簽名算法。同時新增ChaCha20和Poly1305密碼算法,通過Cipher.getInstance 使用。還有 Curve25519和Curve448被添加。AES128和265也支持了Kerberos 5 encryption。
10、本地參數支持Lambda
簡單理解就是lambda表達式的變量申明可以用var。
lst.forEach((var x) -> { System.out.print(x); });
11、單java文件加載運行
單個的*.java文件可以直接用java命令來執行,格式:java HelloWorld.java。
12、飛行記錄器分析工具
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。

參考文檔中會有使用詳細介紹,也可以參考下面測試例子(掃描很慢,要些耐心等):
java -jar binaryAppScanner.jar Root.war --analyzeJavaSE --sourceJava=oracle8 --targetJava=java11 --output=./java11/RootReport.html
查看幫助命令:
java -jar binaryAppScanner.jar Root.war --help --all

報告結果如下:





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公司很善于打官司,所以這點很重要。
