作者:Owen_Jia
來(lái)源:https://my.oschina.net/timestorm/blog/3127044
目前最新JDK 11,Oracle會(huì)一直維護(hù)到2026年。
JAVA11的新特性
1、更新支持到Unicode 10編碼
Unicode 10(version 10.0 of the Unicode Standard),Unicode是一個(gè)不斷在演進(jìn)的行業(yè)標(biāo)準(zhǔn),Java一直在與它保持一致兼容。
Java8已經(jīng)更新了Unicode8.0-9.0,Java10更新后將達(dá)到16018個(gè)characters、18種blocks和10種scripts。
2、將Http Client作為JDK標(biāo)準(zhǔn)發(fā)布、
原來(lái)作為jdk補(bǔ)充的http類放在jdk.incubator.http包中,現(xiàn)在統(tǒng)一改到j(luò)ava.net.http包下,核心類有下面4個(gè)。
- HttpClient
- HttpRequest
- HttpResponse
- WebSocket

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

這里要提一下Class類新增的方法:
// 獲取宿主類。非嵌套類的宿主類是它本身。 public Class<?> getNestHost() // 判斷該類是否是某個(gè)類的嵌套類 public boolean isNestmateOf(Class<?> c) // 返回某個(gè)類的嵌套類數(shù)組。第 1 個(gè)固定是宿主類,之后的是該宿主類的嵌套成員,但不保證順序,同時(shí)也會(huì)包含自身 public Class<?>[] getNestMembers()
9、新增和優(yōu)化諸多加密算法
對(duì)PKCS#1 v2.2內(nèi)提供更多算法,如RSASSA-PSS簽名算法。同時(shí)新增ChaCha20和Poly1305密碼算法,通過(guò)Cipher.getInstance 使用。還有 Curve25519和Curve448被添加。AES128和265也支持了Kerberos 5 encryption。
10、本地參數(shù)支持Lambda
簡(jiǎn)單理解就是lambda表達(dá)式的變量申明可以用var。
lst.forEach((var x) -> { System.out.print(x); });
11、單java文件加載運(yùn)行
單個(gè)的*.java文件可以直接用java命令來(lái)執(zhí)行,格式:java HelloWorld.java。
12、飛行記錄器分析工具
Jvm啟動(dòng)參數(shù):-XX:StartFlightRecording
Java11中將這款原來(lái)商用的工具集成到j(luò)dk標(biāo)準(zhǔn)中了,它是一種低開(kāi)銷的事件信息收集框架,用來(lái)對(duì)應(yīng)用程序和JVM 進(jìn)行故障檢查、分析,收集應(yīng)用程序、JVM 和 OS的數(shù)據(jù)并保存在單獨(dú)的事件記錄文件中,故障發(fā)生后,能夠從事件記錄文件中提取出有用信息對(duì)故障進(jìn)行分析。
更多其他能力
還有很多其他更新就不一一介紹了,這些都是JDK標(biāo)準(zhǔn)包支持的基礎(chǔ)能力,得感謝Oracle持續(xù)對(duì)JDK發(fā)布的支持。完整的jdk11變化清單可以去官網(wǎng)查看;
從11開(kāi)始移除的模塊清單
- 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
- 更多請(qǐng)查看官網(wǎng)
升級(jí)建議(重要)
從Java 11后Oracle不再單獨(dú)發(fā)布JRE和Server JRE了,并統(tǒng)一JDK名稱為:Oracle JDK 。
另外Java 11及之后的版本,將不會(huì)再發(fā)布對(duì)32位操作系統(tǒng)支持的版本。

新舊項(xiàng)目不同策略
新啟的Java項(xiàng)目建議直接從Oracle JDK 11開(kāi)始搭建,千萬(wàn)不要猶豫,因?yàn)榧夹g(shù)都是越新越強(qiáng)的。Java8就像晚期的大眾,而Java11卻是新興的特斯拉。
歷史的項(xiàng)目如果只是維護(hù)的話,干脆就放著運(yùn)行不要?jiǎng)雍昧耍饶奶鞗Q定重構(gòu)了再考慮升級(jí)到Java11。因?yàn)樽畲蟮膯?wèn)題不是自己公司開(kāi)發(fā)的Code不能遷移到高版本,而是項(xiàng)目中引入的第三方Jar,這個(gè)東西搞起來(lái)十分頭疼。
JDK升級(jí)分析工具
升級(jí)最擔(dān)心的就是被刪除的模塊!
推薦IBM公司Liberty團(tuán)隊(duì)提供了一個(gè)十分好用的檢測(cè)Toolkit程序,可以掃描應(yīng)用程序二進(jìn)制文件(.war),發(fā)現(xiàn)的任何潛在的Java 11問(wèn)題并生成html報(bào)告。絕對(duì)的大利器,詳細(xì)內(nèi)容直接查看IBM官方介紹:Scanner Kit。
直接運(yùn)行java -jar binaryAppScannerInstaller.jar,按步驟安裝有個(gè)lisence聲明和目錄指定,默認(rèn)目錄名wamt。

參考文檔中會(huì)有使用詳細(xì)介紹,也可以參考下面測(cè)試?yán)樱⊕呙韬苈┠托牡龋?/p>
java -jar binaryAppScanner.jar Root.war --analyzeJavaSE --sourceJava=oracle8 --targetJava=java11 --output=./java11/RootReport.html
查看幫助命令:
java -jar binaryAppScanner.jar Root.war --help --all

報(bào)告結(jié)果如下:





JDK不同于OpenJDK
推薦Oracle JDK,因?yàn)楦臃€(wěn)定可靠。
- 只有Oracle JDK支持Solaris系統(tǒng);
- 只有Oracle JDK才支持msi這樣的安裝程序;
- Oracle JDK版本將每三年發(fā)布一次,而OpenJDK版本每三個(gè)月發(fā)布一次;
- OpenJDK 是一個(gè)參考模型并且是完全開(kāi)源的,而Oracle JDK是 OpenJDK的一個(gè)實(shí)現(xiàn),并不是完全開(kāi)源的;
- Oracle JDK 比 OpenJDK 更穩(wěn)定。OpenJDK和Oracle JDK的代碼幾乎相同,但建議您選擇Oracle JDK,因?yàn)樗?jīng)過(guò)了徹底的測(cè)試和穩(wěn)定修復(fù);
- 在響應(yīng)性和JVM性能方面,Oracle JDK與OpenJDK相比提供了更好的性能;
- Oracle JDK不會(huì)為即將發(fā)布的版本提供長(zhǎng)期支持,用戶每次都必須通過(guò)更新到最新版本獲得支持來(lái)獲取最新版本;
- Oracle JDK根據(jù)二進(jìn)制代碼許可協(xié)議獲得許可,而OpenJDK根據(jù)GPL v2許可獲得許可。Oracle公司很善于打官司,所以這點(diǎn)很重要。
