JDK9新特性-你瞭解多少
modularity System 模組系統
Java 9中主要的變化是已經實現的模組化系統。
Modularity提供了類似於OSGI框架的功能,模組之間存在相互的依賴關係,可以匯出一個公共的API,並且隱藏實現的細節,Java提供該功能的主要的動機在於,減少記憶體的開銷,在JVM啟動的時候,至少會有30~60MB的記憶體載入,主要原因是JVM需要載入rt.jar,不管其中的類是否被classloader載入,第一步整個jar都會被JVM載入到記憶體當中去,模組化可以根據模組的需要載入程式執行需要的class。
在引入了模組系統之後,JDK 被重新組織成 94 個模組。Java 應用可以通過新增的 jlink 工具,建立出只包含所依賴的 JDK 模組的自定義執行時映象。這樣可以極大的減少 Java 執行時環境的大小。使得JDK可以在更小的裝置中使用。採用模組化系統的應用程式只需要這些應用程式所需的那部分JDK模組,而非是整個JDK框架了。
HTTP/2
JDK9之前提供HttpURLConnection API來實現Http訪問功能,但是這個類基本很少使用,一般都會選擇Apache的Http Client,此次在Java 9的版本中引入了一個新的package:java.net.http,裡面提供了對Http訪問很好的支援,不僅支援Http1.1而且還支援HTTP2(什麼是HTTP2?請參見HTTP2的時代來了…),以及WebSocket,據說效能特別好。
注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模組交付。也就是說,這套 API 不能保證 100% 完成。
JShell
java9引入了jshell這個互動性工具,讓Java也可以像指令碼語言一樣來執行,可以從控制檯啟動 jshell ,在 jshell 中直接輸入表示式並檢視其執行結果。當需要測試一個方法的執行效果,或是快速的對錶達式進行求值時,jshell 都非常實用。
除了表示式之外,還可以建立 Java 類和方法。jshell 也有基本的程式碼完成功能。我們在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。
不可變集合工廠方法
Java 9增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工廠方法來建立不可變集合。
除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實現。在建立後,繼續新增元素到這些集合會導致 “UnsupportedOperationException” 。
私有介面方法
Java 8 為我們提供了介面的預設方法和靜態方法,介面也可以包含行為,而不僅僅是方法定義。
預設方法和靜態方法可以共享介面中的私有方法,因此避免了程式碼冗餘,這也使程式碼更加清晰。如果私有方法是靜態的,那這個方法就屬於這個介面的。並且沒有靜態的私有方法只能被在介面中的例項呼叫。
HTML5風格的Java幫助文件
Java 8之前的版本生成的Java幫助文件是在HTML 4中。在Java 9中,Javadoc 的輸出現在符合相容 HTML5 標準。現在HTML 4是預設的輸出標記語言,但是在之後釋出的JDK中,HTML 5將會是預設的輸出標記語言。
Java幫助文件還是由三個框架組成的結構構成,這是不會變的,並且以HTML 5輸出的Java幫助文件也保持相同的結構。每個 Javadoc 頁面都包含有關 JDK 模組類或介面來源的資訊。
多版本相容 JAR
當一個新版本的 Java 出現的時候,你的庫使用者要花費很長時間才會切換到這個新的版本。這就意味著庫要去向後相容你想要支援的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)。這實際上意味著未來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本相容 JAR 功能能讓你建立僅在特定版本的 Java 環境中執行庫程式時選擇使用的 class 版本
在上述場景中, multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個類使用的不是頂層的 multirelease.Helper 這個 class, 而是處在“META-INF/versions/9”下面的這個。這是特別為 Java 9 準備的 class 版本,可以運用 Java 9 所提供的特性和庫。同時,在早期的 Java 諸版本中使用這個 JAR 也是能執行的,因為較老版本的 Java 只會看到頂層的這個 Helper 類。
統一 JVM 日誌
Java 9 中 ,JVM 有了統一的日誌記錄系統,可以使用新的命令列選項-Xlog 來控制 JVM 上 所有元件的日誌記錄。該日誌記錄系統可以設定輸出的日誌訊息的標籤、級別、修飾符和輸出目標等。
Java 9 的垃圾收集機制
Java 9 移除了在 Java 8 中 被廢棄的垃圾回收器配置組合,同時把G1設為預設的垃圾回收器實現。替代了之前預設使用的Parallel GC,對於這個改變,evens的評論是醬紫的:這項變更是很重要的,因為相對於Parallel來說,G1會在應用執行緒上做更多的事情,而Parallel幾乎沒有在應用執行緒上做任何事情,它基本上完全依賴GC執行緒完成所有的記憶體管理。這意味著切換到G1將會為應用執行緒帶來額外的工作,從而直接影響到應用的效能
I/O 流新特性
java.io.InputStream 中增加了新的方法來讀取和複製 InputStream 中包含的資料。
readAllBytes:讀取 InputStream 中的所有剩餘位元組。
readNBytes: 從 InputStream 中讀取指定數量的位元組到陣列中。
transferTo:讀取 InputStream 中的全部位元組並寫入到指定的 OutputStream 中 。
102: Process API Updates
143: Improve Contended Locking
165: Compiler Control
197: Segmented Code Cache
200: The Modular JDK
211: Elide Deprecation Warnings on Import Statements
213: Milling Project Coin
215: Tiered Attribution for javac
217: Annotations Pipeline 2.0
220: Modular Run-Time Images
222: jshell: The Java Shell (Read-Eval-Print Loop)
224: HTML5 Javadoc
226: UTF-8 Property Files
228: Add More Diagnostic Commands
231: Remove Launch-Time JRE Version Selection
233: Generate Run-Time Compiler Tests Automatically
236: Parser API for Nashorn
238: Multi-Release JAR Files
241: Remove the jhat Tool
244: TLS Application-Layer Protocol Negotiation Extension
246: Leverage CPU Instructions for GHASH and RSA
248: Make G1 the Default Garbage Collector
250: Store Interned Strings in CDS Archives
252: Use CLDR Locale Data by Default
254: Compact Strings
256: BeanInfo Annotations
258: HarfBuzz Font-Layout Engine
260: Encapsulate Most Internal APIs
262: TIFF Image I/O
264: Platform Logging API and Service
266: More Concurrency Updates
268: XML Catalogs
270: Reserved Stack Areas for Critical Sections
272: Platform-Specific Desktop Features
274: Enhanced Method Handles
276: Dynamic Linking of Language-Defined Object Models
278: Additional Tests for Humongous Objects in G1
280: Indify String Concatenation
282: jlink: The Java Linker
284: New HotSpot Build System
287: SHA-3 Hash Algorithms
289: Deprecate the Applet API
292: Implement Selected ECMAScript 6 Features in Nashorn
295: Ahead-of-Time Compilation
相關文章
- JDK8新特性-你瞭解多少JDK
- JDK10新特性-你瞭解多少JDK
- JDK9新特性詳解JDK
- NIO你真正瞭解多少?
- java異常你瞭解多少Java
- 關於Synchronized你瞭解多少?synchronized
- Java String 物件,你瞭解多少?Java物件
- 當紅“Serverless”,你瞭解多少?Server
- Java8新特性,你應該瞭解這些!Java
- 關於新媒體運營崗位,你瞭解多少?
- 沉浸式展館你瞭解多少?
- 抽象類和介面,你瞭解多少?抽象
- 關於繼承,你瞭解多少?繼承
- Android Studio3.3你瞭解多少?Android
- 你對CommonJS規範瞭解多少?JS
- 帶你瞭解PHP7裡生成器的新特性PHP
- 直流負載的案例,你瞭解多少?負載
- 區塊鏈價值你瞭解多少?區塊鏈
- 商城系統原始碼你瞭解多少?原始碼
- 關於區塊鏈你瞭解多少區塊鏈
- HTTP專業術語,你瞭解多少?HTTP
- Python 的技巧和方法你瞭解多少?Python
- 面試-關於Http協議你瞭解多少,有多少說多少面試HTTP協議
- 你對Linux瞭解多少?看看不吃虧!Linux
- 細粒度授權二三事,你瞭解多少?
- 面試必問之 CopyOnWriteArrayList,你瞭解多少?面試
- 關於Linux你瞭解多少?Linux由來Linux
- 關於Linux知識你瞭解多少呢?Linux
- 關於Linux你瞭解多少?Linux由來!Linux
- 面試必問的volatile,你瞭解多少?面試
- 對Docker的瞭解,你能讀懂多少?Docker
- 你不得不瞭解 Helm 3 中的 5 個關鍵新特性
- Solon 3.0 新特性:HttpUtils 瞭解一下HTTP
- P2Link內網穿透你瞭解多少內網穿透
- GO 語言的併發模式你瞭解多少?Go模式
- Python常用的web開發工具,你瞭解多少?PythonWeb
- 關於Mysql資料儲存,你瞭解多少?MySql
- 2020 總結 | VoltDB的亮點,你瞭解多少?