JavaOne 2015 主題演講 Part1
在JavaOne 2015主題演講上,甲骨文公司Java平臺開發部的負責人Georges Saab、Mark Reinhold、Brian Goetz與其他人一起,談論了Java20年來的發展歷程。在本文的第一部分,InfoQ介紹了Reinhold的主題演講。今天,我們將介紹 Brian Goetz,他是Java平臺開發部的Java語言架構師,他窺見了Java10甚至更高版本的所有內在機理,尤其是談論到Valhalla項目和 Panama項目,而它們正是為Java 虛擬機和Java語言本身孕育重大進展的兩個項目。這些進展旨在豐富Java虛擬機與底層硬件(包括操作系統)以及非Java應用編程接口之間的關聯。
動機
隨著時間的推移,越來越復雜的處理器核心設計已經影響了成本模型的時鐘周期和底層硬件/中央處理器內核的分發槽問題。高速緩存缺失是非常昂貴的,尤其是當你還需要從主內存中讀取數據的時候。因此急需Java和Java虛擬機具有更密集和平整的內存布局來提供更好的緩存和內存效率,從而跟上當今時代硬件的發展步伐。
Valhalla項目
Goetz提到Valhalla項目包括了一些Java語言和Java虛擬機的特色,這些特色用于與純數據共同協作,而這些純數據不包含對象強加的所有開銷。他為我們舉了以下的例子,并進行了相應的解釋:
假設有一個簡單的域對象 Point Class:
class Point { final int x; final int y; }
一個X-Y的實例數組會伴隨著150%的內存開銷,只為表示數據的兩個詞;一個兩個詞的對象頭(通常用于所有的對象)及其元素,作為Point對象的引用,再加上每一個Point對象的頭:
值類型
如果Point類不可改,我們就不要求它的身份;我們可以將Point類以數值類的形式定義為一個純數據類型的Point。
value class Point { final int x; final int y; }
在這個例子里,這樣的數值類型將不存在間接引用。因此,我們擁有一個友好的高速緩存布局,而這個布局不僅可以高效地使用內存,還具有更好的局域性。
據Goetz稱:
數值類型就像類和基元之間的高速公路…從代碼上來說,它們像類,但是從表現上來說,它們像整型變量。
特化 泛型
有人提議通過增強Java語言和Java虛擬機來加強對超基元泛型的支持。關于數值類型的好消息就是它們可以向基元類型那樣裝箱了。結果,泛型被支持的程度最終也將超過所有數值類型。
據Goetz所稱,即便你工作時用的是:
ArrayList<Integer>
但實際上你想要的是:
ArrayList<int>
因此現階段核心Java庫中無法實現你用前者工作卻追求后者。但當你指定
ArrayList<Integer>
其內存控制和內存開銷的低效性與之前x-y Point類數組的例子十分相似。
如果指定:T為整型,對T進行裝箱(Box<T> for T=int),并對值類型進行擴展,開發者就會實現之前數值類型的那個例子中說的巨大的成本效益。
Panama項目
接下來,Goetz繼續討論Panama項目,該項目旨在為本地數據(例如:本地堆中的數據)和本機代碼(例如:C中的函數)以更快、更加可信和更加安全的方式提供Java虛擬機的訪問權限。
在Panama項目中,名為jextract的本地頭文件輸入工具會提取布局元數據(例如:C的頭文件),并生成Java接口去調用本地方法或訪問本地結構。在運行時期間,Java虛擬機會生成與用戶可能編寫的JNI代碼相似的代碼。
Goetz為我們舉了個例子,該例子需要將指針傳遞給結構,以便從time.h中調用gettimeofday()。因此,我們采用jextract來解析頭文件,同時也會得到機器類型的信息。所得到的jar文件具有結構的定義和方法的聲明。
因此,所有需要調用上述方法的類與結構都是時間庫的參考,同時也是一種結構的創造,正如以下代碼所示。
正如上述代碼所示,之后想要獲取屬性就像調用getter方法一樣簡單了。
延伸資源
有關Valhalla項目和Panama項目的更多信息,請參閱:
http://mail.openjdk.java.net/pipermail/announce/2014-June/000172.html
https://blogs.oracle.com/jrose/entry/the_isthmus_in_the_vm
查看英文原文: JavaOne 2015 Keynote Part2