您的位置 首页 java

Java 20年,以后将往哪儿走?

在今年的Java 20周年的庆祝大会中,JavaOne 2015 的中心议题是“Java 的20年”。甲骨文公司Java平台软件开发部的副总裁Georges Saab的主题演讲就将关注点放在了java的发展历程、它主要的发展里程碑,并且深度关注于Java8及其更新。甲骨文公司Java平台首席架构师Mark Reinhold的主题演讲奠定了Java发展的路线图,并展示了定于2016年Q3季度发布的Java9 。

Reinhold提到Java成功的关键在于辨识到了痛点;找出了缺失的抽象类并添加了抽象类,以此方式来满足现有的解决方案。

Reinhold还说到“目标是随着时间的推移,要持续改善开发人员的开发效率,同时保留Java的可读性、简化性、通用性以及兼容性的核心价值。”

他推断,缺失的抽象类已经引领了Java5的泛型与Java8的lambdas表达式中的重大创新。2008年,Jigsaw项目引入了模块的概念,以此来解决两个不同的痛点:类路径地狱(Classpath Hell)和庞大的单体 JDK。

类路径地狱(Classpath Hell)

据Reinhold所称,类路径(Classpath)的根本问题在于它们不仅仅是类。他说“类路径是一种查找类的方式,不必关心组件、包甚至它们的预期用途。”

在类路径中,甚至都无法确定你们寻找的类就在jar文件内;我们也不知道是否有任何与应用开发接口相关的冲突。并且,当开发人员不知道或是不理解内部接口的目的,并对其进行改变时,内部接口就可能会暴露出一些安全问题。

  • 关注InfoQ[ID:infoqchina]了解更多技术领域干货内容。

据Reinhold所称,模块为jar文件提供了一个强有力的抽象类,模块是一个程序组件,它不仅能在java编程语言中实现,在java 虚拟机中同样也能。正如他所说的“模块是脱离类路径地狱(Classpath Hell)的关键。”

  • 模块可被看做是包的容器,与此同时,该模块也表述了它与其他模块是如何联系的;

  • 模块是包的容器;

  • 模块为其依赖的其他模块命名;

  • 一个模块不会对其他模块进行干扰;

  • 模块只有通过其它依赖它的模块才能输出特定的包来使用。

为了在Java9中使用模块,所需的jar文件中的模块必须在module-info.java文件中进行声明。文件名不是一个类的名字,它是一个约定,就像package-info.java一样;但它仍可以通过javac进行编译。模块化的jar文件包含module-info.class。该模块化的jar文件可作为一个单独的产物进行传送;对于java9预先发布的版本来说,模块化jar文件就像常规jar文件一样运行。

Reinhold提到,通过允许终端用户以从下到上或从上到下的方式将现有的系统进行模块化,模块的采用就大大地简化了。

单体JDK

Jigsaw项目提供了很多新的用例,传统意义上来讲这些用例不适合庞大的单体Java SE JDK。某些用例包括:

  • 小型设备——没有足够空间去存储所有的Java SE 包。

  • 云应用——不需要复制整个的Java SE JDK。因为在云中,密度是主要因素。(注:密度指的是能为一套特定的软硬件进行交付的系统与服务的数量。)

  • 维护与安全——庞大、整体化的JDK系统在子系统之间存在着千丝万缕的联系。并且,它缺乏内部接口的封装,这会导致安全问题。

据Reinhold所称,“模块为强有力的封装提供可依赖的配置。”

有了模块化,伴随着增强的安全性,开发人员只使用需要的功能。因此,在JDK 9中,所有非关键的内部接口将被封装。某些关键的内部接口例如sun.misc.Unsafe仍然可以访问。(绝大部分)内部接口封装的提出表明“JDK 9中引入的、替换掉原有版本的关键内部接口在JDK 9中将被弃用,或者被封装或者在JDK 10中被删除。”Reinhold 提到被封装后的内部接口仍可以在编译时和运行时通过命令行标志来进行访问。

在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方法一样简单了。

文章来源:智云一二三科技

文章标题:Java 20年,以后将往哪儿走?

文章地址:https://www.zhihuclub.com/188592.shtml

关于作者: 智云科技

热门文章

网站地图