天天看點

Java10新特性及使用

作者:左右為攻

Java 9釋出後,Java 10 來得非常快。與之前的版本不同,Java 10 沒有那麼多令人興奮的特性,但它仍然有一些重要的更新會改變你的編碼方式,以及影響其他未來的 Java 版本。

本文主要内容:

  • var關鍵字:局部變量類型推斷(它被稱為是 JDK 10 中開發人員唯一真正關心的功能)
  • 基于時間的釋出版本控制
  • 垃圾收集器接口
  • G1 的并行全 GC
  • 替代儲存設備上的堆配置設定
  • 将多JDK 林 整合到單個存儲庫中
  • 應用程式類-資料共享
  • 附加 Unicode 語言标簽擴充
  • 根證書
  • 基于 Java 的 JIT 編譯器(實驗性)
  • Thread-Local握手
  • 删除 Native-Header 生成工具

1. var關鍵字:局部變量類型推斷

Java 現在有var聲明。它允許開發者在不指定其類型的情況下聲明局部變量。變量的類型将從建立的實際對象的類型中推斷出來。它被稱為是 JDK 10 中開發人員唯一真正使用到的功能。例如

var str = "Hello world"; 
//等同于
String str = "Hello world";           

2. 基于時間的釋出版本控制

從 Java 10 開始,Oracle 采用了基于時間的版本字元串方案。版本号的新格式為:

$FEATURE.$INTERIM.$UPDATE.$PATCH           

與舊版本不同,新的基于時間的版本不會延遲,并且功能将每六個月釋出一次,并且對版本中可以釋出的功能沒有限制。

也有長期版本 (LTS)。主要面向企業客戶。産品的 LTS 版本将提供 Oracle 的首要且持續的支援,并且每 3 年提供一次。此外,這些版本的更新将至少提供三年。

3. 垃圾收集器接口

在早期的 JDK 結構中,組成垃圾收集器 (GC) 實作的元件分散在代碼庫的各個部分。它在 Java 10 中發生了變化。現在,它是 JVM 源代碼中的一個幹淨的接口,允許快速輕松地內建替代收集器。它将改善不同垃圾收集器的源代碼隔離。

這純粹是重構。之前工作的一切都需要事後工作,性能不應該倒退。

4. G1 的并行全 GC

Java 9 引入了 G1(垃圾優先)垃圾收集器。G1 垃圾收集器旨在避免完全收集,但是當并發收集無法足夠快地回收記憶體時。通過此更改,将發生回退完整 GC。

G1 的完整 GC 的目前實作使用單線程标記-掃描-緊湊算法。此更改将并行化 mark-sweep-compact 算法并使用相同數量的線程。當收集的并發線程無法足夠快地恢複記憶體時,它将被觸發。

線程數可以通過-XX:ParallelGCThreads選項來控制。

5. 替代儲存設備上的堆配置設定

此更改的目标是使 HotSpot VM 能夠在使用者指定的備用記憶體裝置(例如 NV-DIMM)上配置設定 Java 對象堆。

要在此類記憶體中配置設定堆,我們可以添加一個新選項-XX:AllocateHeapAt=<path>. 此選項将擷取檔案系統的路徑并使用記憶體映射來實作在記憶體裝置上配置設定對象堆的預期結果。現有的與堆相關的标志,如-Xmx、-Xms等,以及與垃圾收集相關的标志将繼續像以前一樣工作。

6. 将 JDK 林整合到單個存儲庫中

作為此更改的一部分,JDK 林的衆多存儲庫被合并到一個存儲庫中,以簡化和簡化開發。

在 JDK 9 中有八個存儲庫:root、corba、hotspot、jaxp、jaxws、jdk、langtools和nashorn. 在統一的林中,Java 子產品的代碼通常組合在一個頂級src目錄下。例如,今天在 JDK 林中有基于子產品的目錄,如

$ROOT/jdk/src/java.base
...
$ROOT/langtools/src/java.compiler
...           

在合并的森林中,此代碼改為組織為-

$ROOT/src/java.base
$ROOT/src/java.compiler
...           

7. 應用程式類-資料共享

此功能的目标是改善啟動足迹,擴充現有的類資料共享 (“CDS”) 功能以允許将應用程式類放置在共享存檔中。

JDK 5 中引入的類資料共享允許将一組類預處理為共享存檔檔案,然後可以在運作時進行記憶體映射以減少啟動時間。當多個 JVM 共享同一個歸檔檔案時,它還可以減少動态記憶體占用。

目前 CDS 隻允許引導類加載器加載歸檔類。應用程式 CDS 允許内置系統類加載器、内置平台類加載器和自定義類加載器加載歸檔類。

指定-XX:+UseAppCDS指令行選項以啟用系統類加載器、平台類加載器和其他使用者定義的類加載器的類資料共享。

8. 附加 Unicode 語言标簽擴充

它的目标是增強java.util.Locale和相關的 API 以實作BCP 47語言标簽的額外 Unicode 擴充。最初在 Java SE 7 中添加了對 BCP 47 語言标簽的支援,支援僅限于月曆和數字的 Unicode 語言環境擴充。此 JEP 将在相關 JDK 類中實作更多最新LDML 規範中指定的擴充。

此 JEP 将添加對以下附加擴充的支援:

  • cu(貨币類型)
  • fw(一周的第一天)
  • rg(區域覆寫)
  • tz(時區)

修改後的相關API有:

java.text.DateFormat::get*Instance
java.text.DateFormatSymbols::getInstance
java.text.DecimalFormatSymbols::getInstance
java.text.NumberFormat::get*Instance
java.time.format.DateTimeFormatter::localizedBy
java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern
java.time.format.DecimalStyle::of
java.time.temporal.WeekFields::of
java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}
java.util.Currency::getInstance
java.util.Locale::getDisplayName
java.util.spi.LocaleNameProvider           

9. 根證書

cacerts 密鑰庫是 JDK 的一部分,旨在包含一組根證書,可用于在各種安全協定中使用的證書鍊中建立信任。然而,JDK 源代碼中的 cacerts 密鑰庫目前是空的。

cacerts 密鑰庫将填充一組由 Oracle 的 Java SE 根 CA 程式的 CA 頒發的根證書。許多供應商已經簽署了所需的協定,并且每個供應商都将包含一份根證書清單。未簽署協定的将不包括在内。那些需要更長時間處理的将包含在下一個版本中。

這也意味着 Oracle 和 Open JDK 二進制檔案在功能上是相同的。TLS 等關鍵安全元件将預設在未來的 OpenJDK 建構中工作。

10. 基于 Java 的 JIT 編譯器(實驗性)

此功能使基于 Java 的 JIT 編譯器Graal可以用作 Linux/x64 平台上的實驗性 JIT 編譯器。Graal 将使用 JDK 9 中引入的 JVM 編譯器接口 (JVMCI)。Graal 已經在 JDK 中,是以将其作為實驗性 JIT 啟用将主要是測試和調試工作。

要啟用 Graal 作為 JIT 編譯器,請在 java 指令行上使用以下選項:

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler           

Graal 是從頭開始用 Java 完全重寫 JIT 編譯器。以前的 JIT 編譯器是用 C++ 編寫的。

11. Thread-Local握手

這個 JEP 為提高 VM 性能奠定了基礎,它可以在應用程式線程上執行回調,而無需執行全局 VM 安全點。這意味着 JVM 可以停止單個線程,而不僅僅是所有線程。

線程本地握手最初将在 x64 和 SPARC 上實作。其他平台将退回到正常的安全點。一個新的産品選項-XX:ThreadLocalHandshakes(預設值true)允許使用者在支援的平台上選擇正常的安全點。

12. 删除 Native-Header 生成工具

它将javah從 JDK 中删除該工具,這是一個在編譯 JNI 代碼時生成頭檔案的單獨工具,因為這可以通過javac.

這是 Java 10 的另一個專注于内務管理的特性。

繼續閱讀