Java11的新特性
1、更新支持到Unicode 10編碼
Unicode 10(version 10.0 of the Unicode Standard),Unicode是一個不斷在演進的行業(yè)標準,Java一直在與它保持一致兼容。
Java8已經(jīng)更新了Unicode8.0-9.0,Java10更新后將達到16018個characters译荞、18種blocks和10種scripts瓤的。
2、將Http Client作為JDK標準發(fā)布磁椒、
原來作為jdk補充的http類放在jdk.incubator.http包中堤瘤,現(xiàn)在統(tǒng)一改到java.net.http包下,核心類有下面4個浆熔。
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
3本辐、新增優(yōu)化很多方法
java.util.Collection增加新方法toArray(IntFunction),集合轉數(shù)組的不二之選医增。
String增加lines\stripLeading\stripTrailing等慎皱,一般項目都有StringUtils類。
java.io.InputStream增加構造方法
java.nio包下面很大類擴展了方法Channels\XXXBuffer等
4叶骨、支持動態(tài)分配 Compiler Threads
JVM啟動參數(shù)新增-XX:+UseDynamicNumberOfCompilerThreads茫多,動態(tài)的控制編程線程的數(shù)量,原來的編譯線程默認會啟動大量造成cpu和memory浪費忽刽。
5天揖、GC能力大幅提升
低功耗可擴展GC(ZGC)模塊是一個試驗性的并發(fā)GC,在線程執(zhí)行是ZGC會做一些重型回收工作跪帝,如string表清理等今膊。執(zhí)行周期在10ms內(nèi),處理heaps大小從MB到TB范圍伞剑,目前只能支持linux和x64系統(tǒng)斑唬,除此外還有個處理memory分配的Epsilon GZ,有興趣的可以自己研究黎泣。
6恕刘、堆分析能力提升:JVMTI
提供了一個低負載的堆分配采集分析程序:JVMTI,默認啟動方案可以持續(xù)工作且不造成服務器壓力抒倚,面向接口編程褐着,能夠收集活著和死去的對象信息。
7衡便、Transport Layer Security 1.3更新
簡稱TLS1.3是網(wǎng)絡傳輸層協(xié)議献起,需要注意的它不兼容歷史版本而且官方承認有風險,希望后續(xù)能不斷優(yōu)化镣陕。
8、嵌套訪問控制
嵌套是一種訪問控制上下文姻政,它允許多個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環(huán)境下會報錯鹊碍,但在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)
// 返回某個類的嵌套類數(shù)組侈咕。第 1 個固定是宿主類公罕,之后的是該宿主類的嵌套成員,但不保證順序耀销,同時也會包含自身
public Class<?>[] getNestMembers()
9楼眷、新增和優(yōu)化諸多加密算法
對PKCS#1 v2.2內(nèi)提供更多算法,如RSASSA-PSS簽名算法熊尉。同時新增ChaCha20和Poly1305密碼算法罐柳,通過Cipher.getInstance使用。還有 Curve25519和Curve448被添加狰住。AES128和265也支持了Kerberos 5 encryption张吉。
10、本地參數(shù)支持Lambda
簡單理解就是lambda表達式的變量申明可以用var催植。
lst.forEach((var x) -> {System.out.print(x);});復制代碼
11肮蛹、單java文件加載運行
單個的*.java文件可以直接用java命令來執(zhí)行,格式:java HelloWorld.java创南。
12伦忠、飛行記錄器分析工具
Jvm啟動參數(shù):-XX:StartFlightRecording
Java11中將這款原來商用的工具集成到jdk標準中了,它是一種低開銷的事件信息收集框架扰藕,用來對應用程序和JVM 進行故障檢查缓苛、分析,收集應用程序邓深、JVM 和 OS的數(shù)據(jù)并保存在單獨的事件記錄文件中未桥,故障發(fā)生后,能夠從事件記錄文件中提取出有用信息對故障進行分析芥备。
更多其他能力
還有很多其他更新就不一一介紹了冬耿,這些都是JDK標準包支持的基礎能力,得感謝Oracle持續(xù)對JDK發(fā)布的支持萌壳。完整的jdk11變化清單可以去官網(wǎng)查看亦镶;
從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
更多請查看官網(wǎng)
升級建議(重要)
從Java 11后Oracle不再單獨發(fā)布JRE和Server JRE了,并統(tǒng)一JDK名稱為:Oracle JDK袱瓮。
另外Java 11及之后的版本缤骨,將不會再發(fā)布對32位操作系統(tǒng)支持的版本。
新舊項目不同策略
新啟的Java項目建議直接從Oracle JDK 11開始搭建尺借,千萬不要猶豫绊起,因為技術都是越新越強的。Java8就像晚期的大眾燎斩,而Java11卻是新興的特斯拉虱歪。
歷史的項目如果只是維護的話蜂绎,干脆就放著運行不要動好了,等哪天決定重構了再考慮升級到Java11笋鄙。因為最大的問題不是自己公司開發(fā)的Code不能遷移到高版本师枣,而是項目中引入的第三方Jar,這個東西搞起來十分頭疼萧落。
JDK升級分析工具
升級最擔心的就是被刪除的模塊践美!
推薦IBM公司Liberty團隊提供了一個十分好用的檢測Toolkit程序,可以掃描應用程序二進制文件(.war)铐尚,發(fā)現(xiàn)的任何潛在的Java 11問題并生成Html報告拨脉。絕對的大利器,詳細內(nèi)容直接查看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灵妨,因為更加穩(wěn)定可靠解阅。
只有Oracle JDK支持Solaris系統(tǒng);
只有Oracle JDK才支持msi這樣的安裝程序泌霍;
Oracle JDK版本將每三年發(fā)布一次货抄,而OpenJDK版本每三個月發(fā)布一次;
OpenJDK 是一個參考模型并且是完全開源的朱转,而Oracle JDK是 OpenJDK的一個實現(xiàn)蟹地,并不是完全開源的;
Oracle JDK 比 OpenJDK 更穩(wěn)定藤为。OpenJDK和Oracle JDK的代碼幾乎相同怪与,但建議您選擇Oracle JDK,因為它經(jīng)過了徹底的測試和穩(wěn)定修復缅疟;
在響應性和JVM性能方面分别,Oracle JDK與OpenJDK相比提供了更好的性能;
Oracle JDK不會為即將發(fā)布的版本提供長期支持存淫,用戶每次都必須通過更新到最新版本獲得支持來獲取最新版本耘斩;
Oracle JDK根據(jù)二進制代碼許可協(xié)議獲得許可,而OpenJDK根據(jù)GPL v2許可獲得許可桅咆。Oracle公司很善于打官司煌往,所以這點很重要。
相關鏈接
Java SE Development Kit 11 Downloads
學習過程中遇到什么問題或者想獲取學習資源的話轧邪,歡迎加入Java學習交流群982489835刽脖。等你哦!
作者:程序員java耕耘者
鏈接:https://juejin.im/post/5e187b1f5188254dc42d9985