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