盼望已久的Java 9 已經發布

aqiandao發表於2017-09-22

  人們期待已久的Java SE 9.0將在2017年9月21日釋出,它會帶來一些重要的變化。

  JDK 9的核心變化就是引入了一種新的Java程式設計元件,也就是模組,按照Oracle的說法,它是一個可命名的、自描述的程式碼和資料集合。模組技術的核心目標是減少Java應用和Java核心執行時環境的大小與複雜性。為此,JDK本身進行了模組化,Oracle希望透過這種方式提升效能、安全性和可維護性。

  為了支援Java 9的模組,引入一種新的模組化JAR檔案形式,按照這種形式會在其根目錄中包含一個module-info.class檔案。Oracle同時提供了工具,允許我們組合和最佳化一組模組,形成自定義的執行時映象(image),這樣的映象不必將整個Java執行時包含進來。模組化所帶來的其他變化包括從Java執行時映象中移除了rt.jar和tools.jar。

  InfoQ與Ben Evans進行了交流,以瞭解他對Java 9.0模組系統的看法,他是Java社群程式(JCP)執行委員會的成員。

  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將會為應用執行緒帶來額外的工作,從而直接影響到應用的效能。

  在很多(甚至可以說大多數)場景中,這種額外的效能損耗都不是什麼問題。但是,在這方面,我確實也曾經見過從Parallel切換到G1時,有一定比例的工作負載會引起效能的下降。對於這些應用來說,這種效能下降是無法接受的,所以他們無法切換至G1收集器。隨著G1成為預設的收集器,這將會影響到升級至Java 9的每個應用。

  對於大型的程式碼庫是否需要重構為模組的形式,InfoQ詢問了Martijn Verburg的意見,他是JClarity的CEO,也是倫敦Java使用者組(Java User Group)的聯合組織者。

  Verburg:需要這樣做,另外,我還希望你要處理的大型程式碼庫已經按照一定的模組化結構語義進行了拆分,不管你採用的是OSGi、Maven模組、JBoss模組,還是採用簡單的內部規則,將包和介面的結構劃分出清晰的邊界都可以。

  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是否依然能夠在服務端技術中佔據領導者地位尚有待觀察。

    文章來源:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30065054/viewspace-2145354/,如需轉載,請註明出處,否則將追究法律責任。

相關文章