Mark Reinhold談“Java9及其未來”

dy223 9年前發布 | 26K 次閱讀 Java9

原文  http://www.infoq.com/cn/news/2015/03/java9-and-beyond


Reinhold作了主題為“Java9及其未來”的演講,他分享了即將到來的在Java 9中的功能和Java生態系統未來的一些計劃。

Java 9的一個主要變化是引入了收錄在 JEP200 之中的Java模塊系統。此舉意在提供模塊化的JDK,當運行無需整個環境的應用時,只需加載相對較小的代碼量,一如Mark所言: 打印Hello World不應依賴CORBA 。有了模塊化,Java虛擬機的源代碼布局( JEP201 )、各個Java組件,以及運行時鏡像( JEP220 )都將結束與各種不同目的的模塊綁在一起的歷史。java.base將成為核心層,是否要引入其他模塊,比如 java.loggingjava.sql (包含了 java.sqljavax.sql 包)將視情況而定。

模塊自身可以表達它們之間的依賴關系,但是包還是要從模塊中導出以便為他人使用。由于內部的具體實現,一些包(如 java.base 模塊中的 sun.reflect* 包)對朋友包(如 java.loggingjava.sql 包)可見,但對普通的Java代碼不可見。依賴關系有傳遞性,所以依賴java.sql包的代碼自動繼承對java.logging的依賴,一如在Eclipse bundles中使用Require-Bundle操作。做安全檢查時,將執行 java.lang.SecurityManager::checkPackageAccess ,以確保在運行時檢查該模塊的邊界。

模塊化意味著清除無處不在的rt.jar(曾經取代了Java 1.1中的classes.zip),以及通過創建配置文件( profile )來減少JVM的體積。包含了java.base模塊java.lang包和其他一些包的 compact1 profile大小為11Mb,在此基礎上增加了RMI和XML的 compact2 是17Mb,再加上java.naming、java.management和java.sql的 compact3 是30Mb。完整的JRE仍然可以使用55Mb的選項,JDK擴展了到了150Mb。模塊化還將導致去除擴展類路徑和重組一些庫路徑(具體來說,要將*.properties從lib/文件夾移動到conf/這個新的目錄下)。

系統類處理程序從jar協議更改為jrt協議(Java運行時),這將影響到代碼的編寫。通過定義模塊,可以從rt.jar中加載指定的類。因此, jar:file:/path/to/rt.jar!java/lang/Class.class 的引用將被 jrt:/java.base/java.lang.Class.class 代替。這些是ClassLoader.getSystemResource()方法調用者的實現細節,該方法一直返回一個不透明的URL,但對JAR文件或文件系統有假定關系的代碼將因此而被破壞。工具(集成開發環境,如Eclipse和IntelliJ )中導航到rt.jar的做法,需要使用新的機制導航到模塊;我們已經有了新的FileSystem類,可以執行基于路徑的訪問: FileSystem.getFileSystem("jrt:/") ,瀏覽所有可用的模塊及其內容。

可以使用jlink將這些模塊鏈接到一個運行時,jlink是Java 9中的新工具,用來構建一個只包含運行所需的依賴的自定義鏡像。言下之意是,這將是一個靜態的鏈接選項,提供單一的可執行文件(Google的Go語言就是這么做的)。

模塊化后終于可以去除 *.internal.*sun.* 包了。雖然我們的代碼從未直接使用這些包,但是因為此前缺乏內部包之間的邊界,導致會在代碼庫中不經意間地使用它們。比如sun.misc.BASE64Encoder和sun.misc.BASE64Decoder類的標準對應類是 java.util.Base64.Encoderjava.util.Base64.Decoder 。從Java 8開始可用的工具jdeps,會展示現有文件的內部類依賴,Java 9還將指明哪些模塊被使用了。

預見未來

Mark Reinhold還討論了未來有可能加入JVM的功能,比如值類型(結構體)和值類型(如值類型或原生類型)的泛型增強。這些何時加入還都沒有時間表,但是思考和調研會促進這些功能在未來的某一時刻加入的可能性。Mark Reinhold還討論了未來有可能加入JVM的功能,比如值類型(結構體)和值類型(如值類型或原生類型)的泛型增強。這些何時加入還都沒有時間表,但是思考和調研將會促進這些功能在未來的某一時刻加入的可能性。

值類型是一種代表數據的固定結構,就像一個類。然而與類(引用)不同,JVM的實現允許直接在堆棧或在數組中、一個連續的內存布局上優化數據結構。這改進了對數據結構的訪問,更重要的是改進了CPU的性能,CPU可以從連續的內存中載入一塊數據,而不再使用分布在堆上的指針數組。實現有可能是這樣的:

value /* final */ class Point { int x; int y;
   Point(int x, int y) { this.x = x; this.y = y } 
} 

值類型默認是final的,因此數據結構需要在創建時完全初始化。JIT可以通過對方法調用優化傳遞值,而不是在不必要時也復制。值類型可以有方法,也可以實現接口(潛在地,繼承其他值類型),但是不能被引用,所以不能用null做比較。值類型可用于實現其它類原生類型,比如int128、 Complex或Tuple。

為了實現值類型的泛型,我們需要做些改變;例如,ArrayList包含remove(int index)方法和remove(T value)方法。使用int類型來泛化將導致方法沖突并引起錯誤。雖然引入新的方法removeAt(int index)能解決這個問題,但是需要導出才能使現有的類型繼續使用現有的方法(非值類型)。一種可能的方法是使用條件編譯,可以使用類似 'where ref T { }' 這樣的條件編譯塊,從而導出引用類型而不是值類型。 Valhalla項目 正在研究如何將這兩個概念在未來共存,但是目前仍處于研究階段。

Mark Reinhold還簡要講述了 Panama項目 ,這是一個旨在改進使用Java外部函數接口調用Java本地代碼性能的項目。Java外部函數接口收錄在 JEP191 中,是基于JRuby的已有實現 JNAJNR 提出的。他最后總結說,Java在不斷演化,并有節奏地定位大問題:在Java 5中引入泛型,在Java 8中引入lambda表達式,并在Java 9中引入模塊化,它像激光一樣聚焦于向后兼容性,以免破壞已經存在的代碼或客戶。

查看英文原文: Mark Reinhold on Java 9 and Beyond

 本文由用戶 dy223 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!