千呼萬喚,JDK11於2018-09-25正式發佈GA版本(GA即General Availability,也就是官方推薦能夠普遍使用的版本),其中發佈了包括ZGC、Flight Recorder等17個新特性,讓咱們一睹爲快。
日期 | 階段 | 說明 |
---|---|---|
2018/06/28 | Rampdown Phase One (fork from main line) | 對進入Rampdown階段的變化會應用愈來愈嚴格的審查。在階段1中,只能修復 P1-P3 錯誤。 |
2018/07/26 | Rampdown Phase Two | 在階段2中,只能修復 showstopper 錯誤 |
2018/08/16 | Initial Release Candidate | |
2018/08/30 | Final Release Candidate | 在此階段必須宣佈最終候選版的發佈日期並提交以進行測試 |
2018/09/25 | General Availability | 最終版本,可在生產環境正式使用 |
Java的類型文件格式將被拓展,支持一種新的常量池格式:CONSTANT_Dynamic,加載CONSTANT_Dynamic會將建立委託給bootstrap方法。java
其目標是下降開發新形式的可實現類文件約束帶來的成本和干擾。git
JDK上對這個特性的描述是:開發一個處理內存分配但不實現任何實際內存回收機制的GC,一旦可用堆內存用完,JVM就會退出。程序員
若是有System.gc()的調用,實際上什麼也不會發生(這種場景下和-XX:+DisableExplicitGC效果同樣),由於沒有內存回收,這個實現可能會警告用戶嘗試強制GC是徒勞。github
用法很是簡單:算法
-XX:+UseEpsilonGC。
提供徹底被動的GC實現,具備有限的分配限制和儘量低的延遲開銷,但代價是內存佔用和內存吞吐量。bootstrap
衆所周知,Java實現可普遍選擇高度可配置的GC實現。 各類可用的收集器最終知足不一樣的需求,即便它們的可配置性使它們的功能相交。 有時更容易維護單獨的實現,而不是在現有GC實現上堆積另外一個配置選項。api
它的主要用途以下:緩存
Java EE和CORBA兩個模塊在JDK9中已經標記"deprecated",在JDK11中正式移除。JDK中deprecated的意思是在不建議使用,在將來的release版本會被刪除。安全
JavaEE由4部分組成:併發
可是這個特性和JavaSE關係不大。而且JavaEE被維護在Github(https://github.com/javaee)中,版本同步形成維護困難。最後,JavaEE能夠單獨引用,maven中心倉庫也提供了JavaEE(http://mvnrepository.com/arti...),因此不必把JavaEE包含到JavaSE中。
至於CORBA,使用Java中的CORBA開發程序沒有太大的興趣。所以,在JavaEE就把CORBA標記爲"Proposed Optional",這就代表未來可能會放棄對這些技術的必要支持。
將JDK9引進並孵化的HTTP客戶端API做爲標準,即HTTP/2 Client。它定義了一個全新的實現了HTTP/2和WebSocket的HTTP客戶端API,而且能夠取代HttpURLConnection。
動機
已經存在的HttpURLConnection有以下問題:
在聲明隱式類型的lambda表達式的形參時容許使用var。
lamdba表達式多是隱式類型的,它形參的全部類型所有靠推到出來的。隱式類型lambda表達式以下:
(x, y) -> x.process(y)
Java SE 10讓隱式類型變量可用於本地變量:
var foo = new Foo(); for (var foo : foos) { ... } try (var foo = ...) { ... } catch ...
爲了和本地變量保持一致,咱們但願容許var做爲隱式類型lambda表達式的形參:
(var x, var y) -> x.process(y)
統一格式的一個好處就是modifiers和notably註解能被加在本地變量和lambda表達式的形參上,而且不會丟失簡潔性:
@Nonnull var x = new Foo(); (@Nonnull var x, @Nullable var y) -> x.process(y)
用RFC 7748中描述到的 Curve25519 和Curve448 實現祕鑰協議。RFC 7748定義的祕鑰協商方案更高效,更安全。這個JEP的主要目標就是爲這個標準定義API和實現。
密碼學要求使用 Curve25519 和Curve448 是由於它們的安全性和性能。JDK會增長兩個新的接口XECPublicKey 和 XECPrivateKey,示例代碼以下:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("XDH"); NamedParameterSpec paramSpec = new NamedParameterSpec("X25519"); kpg.initialize(paramSpec); // equivalent to kpg.initialize(255) // alternatively: kpg = KeyPairGenerator.getInstance("X25519") KeyPair kp = kpg.generateKeyPair(); KeyFactory kf = KeyFactory.getInstance("XDH"); BigInteger u = ... XECPublicKeySpec pubSpec = new XECPublicKeySpec(paramSpec, u); PublicKey pubKey = kf.generatePublic(pubSpec); KeyAgreement ka = KeyAgreement.getInstance("XDH"); ka.init(kp.getPrivate()); ka.doPhase(pubKey, true); byte[] secret = ka.generateSecret();
更新平臺API支持Unicode 10.0版本(Unicode 10.0概述:Unicode 10.0 增長了8518 個字符, 總計達到了136,690個字符. 而且增長了4個腳本, 總結139個腳本, 同時還有56個新的emoji表情符號。參考:http://unicode.org/versions/U...)。
Unicode是一個不斷進化的工業標準,所以必須不斷保持Java和Unicode最新版本同步。
提供一個低開銷的,爲了排錯Java應用問題,以及JVM問題的數據收集框架,但願達到的目標以下:
排錯,監控,性能分析是整個開發生命週期必不可少的一部分,可是某些問題只會在大量真實數據壓力下才會發生在生產環境。
Flight Recorder記錄源自應用程序,JVM和OS的事件。 事件存儲在一個文件中,該文件能夠附加到錯誤報告中並由支持工程師進行檢查,容許過後分析致使問題的時期內的問題。工具可使用API從記錄文件中提取信息。
實現RFC 7539中指定的 ChaCha20 和 ChaCha20-Poly1305 兩種加密算法。
惟一一個其餘普遍採用的RC4長期以來一直被認爲是不安全的,業界一致認爲當下ChaCha20-Poly1305是安全的。
加強Java啓動器支持運行單個Java源代碼文件的程序。
單文件程序是指整個程序只有一個源碼文件,一般是早期學習Java階段,或者寫一個小型工具類。以HelloWorld.java爲例,運行它以前須要先編譯。咱們但願Java啓動器能直接運行這個源碼級的程序:
java HelloWorld.java
等價於:
javac -d <memory> HelloWorld.java java -cp <memory> helloWorld java Factorial.java 3 4 5
等價於:
javac -d <memory> Factorial.java java -cp <memory> Factorial 3 4 5
到JDK10爲止,Java啓動器能以三種方式運行:
JDK11再加一個,即第四種方式:啓動一個源文件申明的類。
提供一種低開銷的Java堆分配採樣方法,獲得堆分配的Java對象信息,可經過JVMTI訪問。但願達到的目標以下:
動機
對用戶來講,瞭解它們堆裏的內存是很重要的需求。目前有一些已經開發的工具,容許用戶窺探它們的堆,好比:Java Flight Recorder, jmap, YourKit, 以及VisualVM tools.。可是這工具都有一個很大的缺點:沒法獲得對象的分配位置。headp dump以及heap histo都沒有這個信息,可是這個信息對於調試內存問題相當重要。由於它能告訴開發者,他們的代碼發生(尤爲是壞的)分配的確切位置。
實現TLS協議1.3版本。(TLS容許客戶端和服務端經過互聯網以一種防止竊聽,篡改以及消息僞造的方式進行通訊)。
TLS 1.3是TLS協議的重大改進,與之前的版本相比,它提供了顯着的安全性和性能改進。其餘供應商的幾個早期實現已經可用。咱們須要支持TLS 1.3以保持競爭力並與最新標準保持同步。這個特性的實現動機和Unicode 10同樣,也是緊跟歷史潮流。
ZGC:這應該是JDK11最爲矚目的特性,沒有之一。可是後面帶了Experimental,說明還不建議用到生產環境。看看官方對這個特性的目標描述:
GC是Java主要優點之一。然而,當GC停頓太長,就會開始影響應用的響應時間。消除或者減小GC停頓時長,Java將對更普遍的應用場景是一個更有吸引力的平臺。此外,現代系統中可用內存不斷增加, 用戶和程序員但願JVM可以以高效的方式充分利用這些內存,而且無需長時間的GC暫停時間。
ZGC一個併發,基於region,壓縮型的垃圾收集器,只有root掃描階段會STW,所以GC停頓時間不會隨着堆的增加和存活對象的增加而變長。
ZGC和G1停頓時間比較:
ZGC avg: 1.091ms (+/-0.215ms) 95th percentile: 1.380ms 99th percentile: 1.512ms 99.9th percentile: 1.663ms 99.99th percentile: 1.681ms max: 1.681ms G1 avg: 156.806ms (+/-71.126ms) 95th percentile: 316.672ms 99th percentile: 428.095ms 99.9th percentile: 543.846ms 99.99th percentile: 543.846ms max: 543.846ms
用法:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
由於ZGC還處於實驗階段,因此須要經過JVM參數UnlockExperimentalVMOptions 來解鎖這個特性。
參考: http://openjdk.java.net/proje...