Oracle正式發佈Java 9,引入新的Java編程組件

Java SE 9.0於2017年9月21日發佈。JDK 9的核心變化就是引入了一種新的Java編程組件,也就是模塊,按照Oracle的說法,它是一個可命名的、自描述的代碼和數據集合。模塊技術的核心目標是減小Java應用和Java核心運行時環境的大小與複雜性。爲此,JDK自己進行了模塊化,Oracle但願經過這種方式提高性能、安全性和可維護性。shell

爲了支持Java 9的模塊,引入一種新的模塊化JAR文件形式,按照這種形式會在其根目錄中包含一個module-info.class文件。Oracle同時提供了工具,容許咱們組合和優化一組模塊,造成自定義的運行時鏡像(image),這樣的鏡像沒必要將整個Java運行時包含進來。模塊化所帶來的其餘變化包括從Java運行時鏡像中移除了rt.jar和tools.jar。編程

Java社區進程(JCP)執行委員會的成員Ben Evans認爲最急需重構的應用剛好就是最適合進行模塊化的應用。若是你已經備受Lava Flow/God Class/Stovepipe System地獄的折磨,並且你的利益相關方明確知道這一點,那麼你可能更容易說服他們進行一次完整的底層重構,經過漸進式的努力造成一個完成的模塊解決方案(而不是簡單重構並遷移至Java 8)是值得去作的。安全

Oracle宣佈Java 8會是一個長期支持的發佈版本,會一直支持到2022年,所以Evans認爲不少的應用將會停留在Java 8上,根本不會升級到Java 9。Evans補充說,有些應用可能會讓開發和構建工具鏈使用Java 8版本,而在生產環境使用Java 9的運行時。模塊化

對特定類型的應用來講,這是頗有幫助的。例如,我曾經見到有的電子商務網站具備很是大的堆空間,其中包含了大約40G的字符串數據。Java 9的ompact Strings技術可以將這種類型的內存使用減半。這反過來又會對GC的性能帶來積極的影響。對於有些應用來講(這可能就包括大型的Solr安裝環境及相似場景),單單這一項收益就值得將運行時升級到Java 9。工具

Java 9使用G1做爲默認的垃圾收集器,替代了以前默認使用的Parallel GC。Evans對這項變化的評論:
這項變動是很重要的,由於相對於Parallel來講,G1會在應用線程上作更多的事情,而Parallel幾乎沒有在應用線程上作任何事情,它基本上徹底依賴GC線程完成全部的內存管理。這意味着切換到G1將會爲應用線程帶來額外的工做,從而直接影響到應用的性能。oop

在不少(甚至能夠說大多數)場景中,這種額外的性能損耗都不是什麼問題。可是,在這方面,我確實也曾經見過從Parallel切換到G1時,有必定比例的工做負載會引發性能的降低。對於這些應用來講,這種性能降低是沒法接受的,因此他們沒法切換至G1收集器。隨着G1成爲默認的收集器,這將會影響到升級至Java 9的每一個應用。佈局

JClarity的CEO Martijn Verburg認爲大型的代碼庫須要重構爲模塊的形式。Verburg給出了一些通用的模塊化建議,而且指出了開發人員在採用Java 9模塊系統時,須要注意的一些事情:
閱讀Paul和Sander的圖書「Java 9 modularity」:它是本權威指南,提到了全部須要注意的地方,闡述了模塊、包以及JAR之間如何運行的關聯關係;
在模塊邊界的地方,使用定義良好的接口而且針對這些接口編程;
不要拆分包(split package),也就是說一個包不要分散到兩個模塊中。Adopt OpenJDK有個探測工具,咱們能夠用它來探測已有的代碼;
確保不要存在循環依賴(Jigsaw不容許這樣);
模塊在源碼的佈局上與咱們已習慣的方式有所不一樣,須要確保構建工具可以進行對應的處理;
Jigsaw不支持多版本。性能

按照Verburg的說法,核心要點在於處理循環依賴、拆分包的問題,並確保針對接口進行編碼。在嘗試使用Jigsaw模塊化重構以前,針對已有的代碼庫,這些工做須要預先完成。他還澄清了一個誤解,那就是隻有模塊化的應用才能在Java 9上運行。優化

因爲誤解,在這方面有一種FUD(恐懼、不肯定和懷疑)情緒,有人誤認爲在Java 9上運行的必須是模塊化的應用。事實並不是如此,咱們能夠將已有的基於類路徑的應用直接在Java 9上運行。這裏會有一些新的安全限制,所以咱們須要設置一些特定的運行時標記(除非你重構代碼,使用更安全的方式來訪問Java的內部資源),即使如此,默認的行爲也只是警告,而不是徹底阻止咱們(Java 10的限制會更嚴格)。網站

Verburg認爲Jigsaw會是一個基石,會讓Java的演進更快,這要歸功於Mark Reinhold、Alan Bateman、Mandy Chung以及Jigsaw團隊的其餘成員多年來不知疲倦的工做,正是他們的努力使這一切得以實現。

Java 9還引入了jshell工具。這個命令行環境爲Java平臺帶來了讀入-求值-打印-循環(Read-Eval-Print-Loop,REPL)功能。它的目的在於以即時結果和反饋的形式,簡化原型的實現並幫助咱們探索語言在編碼時的可選項。

Verburg和Evans看到Java 9中包含了jShell都很是興奮,但令他們失望的是,HTTP/2只是做爲Java 9的一個孵化模塊(incubator module)提供的。鑑於社區對這項特性的興趣和提供的幫助,Evans認爲Oracle應該投入足夠的工程資源,將HTTP/2交付爲GA版本。

JDK 9完整的變動列表能夠在Oracle的站點上查閱。Oracle宣佈會按照每六個月一次的節奏進行發佈,意味着Java 9是最後一次「keystone」特性驅動的版本發佈,這反映出了Oracle目前管理Java的特色。Java下一階段的演化將會按照更短的發佈週期而且會按照更加面向特性的方式來發布。Java是否依然可以在服務端技術中佔據領導者地位尚有待觀察。

相關文章
相關標籤/搜索