Java11主要更新介紹
Table of Contents
Nest-Based Access Control - 基於巢狀的訪問控制
Dynamic Class-File Constants - 動態類檔案常量
Improve Aarch64 Intrinsics - 提高Aarch64行內函數
Epsilon: A No-Op Garbage Collector (Experimental) - 無垃圾垃圾收集器實驗
Remove the Java EE and CORBA Modules - 刪除JavaEE和CORBA模組
HTTP Client (Standard) - 標準的Http Client
Local-Variable Syntax for Lambda Parameters - LAMBDA引數的區域性變數語法
ChaCha20 and Poly1305 Cryptographic Algorithms - 密碼演算法
Launch Single-File Source-Code Programs - 啟動單檔案源程式
Low-Overhead Heap Profiling - 低開銷的堆
ZGC: A Scalable Low-Latency Garbage Collector (Experimental) - 一種可擴充套件的低延遲試驗垃圾收集器
Deprecate the Nashorn JavaScript Engine - 棄用了NASHON JavaScript引擎
Deprecate the Pack200 Tools and API - 棄用了PAC200工具和API
java11背景
釋出於2018年9月的java11是java8之後的有一個長期支援版本-Long-Term Support version.這意味著在未來大量現在執行在java7或者java8上的java應用程式都將會遷移到java11這個版本之上。
以下是此版本的一些重要更改和資訊:
- Applet和Web Start應用程式所需的部署堆疊在JDK 9中已棄用,並已在JDK 11中刪除。
- 如果沒有部署堆疊,則已從支援的JDK 11配置列表中刪除了支援的瀏覽器的整個部分。
- 在Windows和macOS上可用於JRE安裝的自動更新不再可用。
- 在Windows和macOS中,在先前版本中安裝JDK可選地安裝了JRE。在JDK 11中,不再有這個選項。
- 在此版本中,不再提供JRE或Server JRE。僅提供JDK。使用者可以使用jlink建立較小的自定義執行時。
- JDK中不再包含JavaFX。它現在可以從openjfx.io單獨下載。
- Oracle JDK不再包含JDK 7,8,9和10中提供的Java Mission Control。它現在是一個單獨的下載。
- 以前的版本被翻譯成英語,日語和簡體中文以及法語,德語,義大利語,韓語,葡萄牙語(巴西),西班牙語和瑞典語。但是,在JDK 11及更高版本中,不再提供法語,德語,義大利語,韓語,葡萄牙語(巴西),西班牙語和瑞典語翻譯。
- Windows的更新包裝格式已從tar.gz更改為.zip,這在Windows作業系統中更為常見。
- 更新後的macOS包格式已從.app更改為.dmg,這更符合macOS的標準。
Nest-Based Access Control - 基於巢狀的訪問控制
引入nests的概念,這是一種訪問控制上下文,與Java程式語言中現有的巢狀型別概念保持一致。 巢狀允許邏輯上屬於同一程式碼實體但被編譯為不同類檔案的類,以訪問彼此的私有成員,而無需編譯器插入可訪問性擴充套件橋接方法。
這個更改簡化了將Java原始碼構造對映到類檔案的規則,因此對選擇使用它們的Java原始碼編譯器有很多影響:
- 正確生成與nest相關的classfile屬性
- 完善以前需要的訪問橋接方法併為私人巢狀成員生成直接成員訪問指令
- 發出正確/適當的呼叫位元組碼
- 能夠將其他合成方法更改為私有而不是包私有(甚至消除它們,或者用共享但私有的方法控制代碼常量替換它們)
在生成最新版本的類檔案時,將更新javac編譯器以充分利用nestmates。
對類檔案進行操作或生成或處理位元組碼的任何工具都可能受到這些更改的影響。 這些工具至少必須容忍新類檔案屬性的存在,並允許更改位元組碼規則,比如:
- javap類檔案檢查工具,
- Pack200實現
- 也在JDK內部使用的ASM位元組碼操作框架。
Dynamic Class-File Constants - 動態類檔案常量
擴充套件Java類檔案格式以支援新的常量池形式CONSTANT_Dynamic。 載入CONSTANT_Dynamic會將建立委託給一個bootstrap方法,就像連結invokedynamic呼叫站點將連結委託給bootstrap方法一樣。
Improve Aarch64 Intrinsics - 提高Aarch64行內函數
改進現有的字串和陣列內在函式,並在AArch64處理器上為java.lang.Math sin,cos和log函式實現新的內在函式。
Epsilon: A No-Op Garbage Collector (Experimental) - 無垃圾垃圾收集器實驗
Epsilon就是一個試驗的代號,這個實驗的目的是開發一個處理記憶體分配但不實現任何實際記憶體回收機制的GC。 一旦可用的Java堆耗盡,JVM將關閉。
實驗的目的是在有限的記憶體分配限制和儘可能低的延遲開銷下,提供完全被動的GC實現。但代價是會佔用一定的記憶體和記憶體吞吐量。成功的體現是在實現了孤立的程式碼更改的同時,不接觸其他GC,並在JVM的其餘部分進行最小的更改。
在有非常多的生存週期非常短的service的分散式系統中,這個GC收集器會非常的有效率
Remove the Java EE and CORBA Modules - 刪除JavaEE和CORBA模組
將Java EE和CORBA模組從Java SE平臺和JDK當中移除。 這些模組在Java SE9當中就已經是deprecated狀態了。
HTTP Client (Standard) - 標準的Http Client
通過JEP 110標準化JDK 9中引入的孵化HTTP客戶端API,並在JDK 10中進行更新。
通過靜態工廠方法建立的BodyPublisher,BodyHandler和BodySubscriber的預定義實現已按照複數命名約定移出到單獨的不可例項化的實用工廠類中。這提高了這些相對較小的介面的可讀性。靜態工廠方法的名稱也按以下大類更新:
fromXxx:來自標準訂戶的介面卡,例如採用Flow.Subscriber返回一個BodySubscriber。
ofXxx:建立新的預定義Body [Publisher | Handler | Subscriber]的工廠,它們執行有用的常見任務,例如將響應主體作為String處理,或將主體流式傳輸到File。
other:Combinators(採用BodySubscriber返回BodySubscriber)和其他有用的操作。
添加了一些BodyHandler和相應的BodySubscriber,以提高常見場景的可用性:
discard(物件替換)組合丟棄/忽略響應主體並允許給定替換。反饋表明這可能看起來令人困惑。它已被刪除並替換為兩個單獨的處理程式:1)丟棄(),和2)替換(物件替換)。
添加了ofLines(),它返回一個BodyHandler <Stream <String >>,以支援逐行傳輸響應體的流。提供與BufferedReader.lines()類似的語義。
從LineSubscriber新增,支援將響應主體適配到String.Subscriber的String行。
添加了BodySubscriber.mapping,用於從一種響應體型別到另一種響應體型別的通用對映。
推送承諾支援已經過重新設計,以減少其對API的影響,並使其更符合常規請求/響應。具體來說,MultiSubscriber和MultiResultMap已被刪除。推送承諾現在通過功能介面PushPromiseHandler處理,該介面可選擇在傳送操作期間提供。
通過用NORMAL替換SAME_PROTOCOL和SECURE策略,簡化了HttpClient.Redirect策略。已經觀察到先前命名的SECURE沒有真正適當地命名並且應該被重新命名為NORMAL,因為它可能適合於大多數正常情況。鑑於上面提到的新命名的NORMAL,SAME_PROTOCOL出現奇怪的命名,可能令人困惑,並且不太可能被使用。
WebSocket.MessagePart已被刪除。在接收方使用此列舉來指示訊息的傳遞是否完整。它與傳送端不對稱,為此目的使用簡單的布林值。另外,已經觀察到用簡單的布林值處理接收的訊息顯著地減少並簡化了接收程式碼邏輯。確定作為整體傳遞的訊息,上述訊息部分的好處和主要目的之一,已證明不具有自身的重要性。
Local-Variable Syntax for Lambda Parameters - LAMBDA引數的區域性變數語法
在宣告隱式型別的lambda表示式的形式引數時允許使用var。
可以隱式地鍵入lambda表示式,並從中推斷出所有形式引數的型別:
(x, y) -> x.process(y) // implicitly typed lambda expression
Java SE 10使隱式型別可用於區域性變數:
var x = new Foo();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...
為了與區域性變數保持一致,jdk開發人員希望允許'var'用於隱式型別的lambda表示式的形式引數:
(var x, var y) -> x.process(y) // implicit typed lambda expression
統一性的一個好處是修飾符,特別是註釋,可以應用於區域性變數和lambda形式,而不會失去簡潔性:
@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)
這個改動朝著消除使用sun.misc的需要邁出了一大步。
Flight Recorder - 飛行記錄儀
提供低開銷的資料收集框架,用於對Java應用程式和HotSpot JVM進行故障排除
這個功能的目標包括:
- 提供用於生成和使用資料作為事件的API
- 提供緩衝機制和二進位制資料格式
- 允許配置和過濾事件
- 為OS,HotSpot JVM和JDK庫提供事件
這將為需要效能和故障排除幫助的開發人員帶來很多幫助。
ChaCha20 and Poly1305 Cryptographic Algorithms - 密碼演算法
實現RFC 7539中指定的ChaCha20和ChaCha20-Poly1305密碼.ChaCha20是一種相對較新的流密碼,可以替代舊的,不安全的RC4流密碼。
Launch Single-File Source-Code Programs - 啟動單檔案源程式
增強java啟動程式以執行作為Java原始碼的單個檔案提供的程式,包括通過“shebang”檔案和相關技術從指令碼中使用。
從JDK 10開始,java啟動程式以三種模式執行:啟動類檔案,啟動JAR檔案的主類,或啟動模組的主類。 這裡我們新增一個新的第四種模式:啟動在原始檔中宣告的類。
對於java初學者來說,這無疑會使得他們執行java程式更加的簡單。
Low-Overhead Heap Profiling - 低開銷的堆
提供一種低開銷的Java堆分配取樣方法,可通過JVMTI訪問。
提供一種從JVM獲取有關Java物件堆分配的資訊的方法:
- 足夠低的開銷足以在預設情況下連續啟用,
- 可通過定義明確的程式化介面訪問,
- 可以對所有分配進行取樣(即,不限於在一個特定堆區域中的分配或以一種特定方式分配的分配),
- 可以以與實現無關的方式定義(即,不依賴於任何特定的GC演算法或VM實現)
- 可以提供有關存活的和死去的Java物件的資訊。
ZGC: A Scalable Low-Latency Garbage Collector (Experimental) - 一種可擴充套件的低延遲試驗垃圾收集器
Z垃圾收集器,也稱為ZGC,是一個可擴充套件的低延遲垃圾收集器。
這個實驗的目標包括:
- GC暫停時間不應超過10毫秒
- 處理堆的大小從相對較小(幾百兆位元組)到非常大(多太位元組)不等
- 與使用G1相比,應用程式吞吐量減少不超過15%
- 為未來的GC功能和優化利用彩色指標和負載障礙奠定基礎
- 最初支援的平臺:Linux / x64
java開發人員有雄心壯志為大量相關工作負載實現這些目標。 但他們也提到並未將這些目標視為對每種可能的工作量的硬性要求。
Deprecate the Nashorn JavaScript Engine - 棄用了NASHON JavaScript引擎
棄用Nashorn JavaScript指令碼引擎和API以及jjs工具,會在將來的版本中刪除它們
Deprecate the Pack200 Tools and API - 棄用了PAC200工具和API
在java.util.jar中棄用pack200和unpack200工具以及Pack200 API。
在介紹完了java11之後,不妨回顧一下java8的主要更新
java8
java程式語言方面
- Lambda Expressions是一種新的語言功能,已在此版本中引入。通過Lambda表示式,我們能夠將一個功能視為方法引數,或將程式碼視為資料。 Lambda表示式允許我們更緊湊地表示單方法介面(即功能介面)的例項。
- 方法引用為已經命名的方法提供了一種易於閱讀的lambda表示式。
- 預設方法允許將新功能新增到庫的介面,並確保與為這些介面的舊版本編寫的程式碼的二進位制相容性。
- 重複註釋提供了對同一宣告或型別使用多次應用相同註釋型別的功能。
- 型別註釋提供了在使用型別的任何地方應用註釋的功能,而不僅僅是在宣告上。 與可插拔型別系統一起使用時,此功能可以改進程式碼的型別檢查。Java 8擴充套件了註解的範圍,幾乎可以為任何東西添加註解,包括區域性變數、泛型類、父類與介面的實現,方法的異常也能添加註解。
- 改進了型別推斷。
- 支援方法引數反射。
容器方面
- 新的java.util.stream包中的類提供了一個Stream API,以支援對元素流的功能樣式操作。 Stream API整合到Collections API中,可以對集合進行批量操作,例如順序或並行map-reduce轉換。
- 改進了HashMap等容器在鍵值key衝突時的效能。即提高了Hash碰撞處理的效率,這一點在新的HashMap實現原始碼中得到了體現
日期時間工具更新
提供了一組包含全面的日期時間模型的包。
IO和NIO
- 提供了基於Solaris事件埠機制的Solaris的新SelectorProvider實現。將系統屬性java.nio.channels.spi.Selector設定為值sun.nio.ch.EventPortSelectorProvider即可使用。
- 減小了<JDK_HOME> /jre/lib/charsets.jar檔案的大小
- 對java.lang.String(byte [],*)建構函式和java.lang.String.getBytes()方法的效能改進。
JDBC
- JDBC-ODBC Bridge已被刪除。
- JDBC 4.2引入了一些新功能。
併發Concurrency
- 在java.util.concurrent.ConcurrentHashMap類中添加了一些方法,以支援基於新新增的流工具和lambda表示式的聚合操作。
- 在java.util.concurrent.atomic包的類中添加了一些方法中以支援可伸縮的可更新變數。
- 在java.util.concurrent.ForkJoinPool類中添加了方法以支援公共池。
- 添加了java.util.concurrent.locks.StampedLock類,以提供基於功能的鎖,其中包含三種控制讀/寫訪問的模式。
HotSpo虛擬機器
- 添加了硬體內在函式以使用高階加密標準(AES)。 UseAES和UseAESIntrinsics標誌可用於為Intel硬體啟用基於硬體的AES內在函式。 硬體必須是2010或更新的Westmere硬體。 例如,要啟用硬體AES,請使用以下標誌:
-XX:+ UseAES -XX:+ UseAESIntrinsics 要禁用硬體AES,可以使用: -XX:-UseAES -XX:-UseAESIntrinsics
- 去除了PermGen這一塊記憶體空間。代替他的是metaspace
- 提供方法呼叫的位元組程式碼指令支援Java程式語言中的預設方法。
java.lang 和 java.util
- 提供並行Array排序
- 支援標準編碼和解碼Base64
- 提供無符號算術支援