BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Mark Reinhold谈“Java9及其未来”

| 作者 Alex Blewitt 关注 4 他的粉丝 ,译者 韩陆 关注 11 他的粉丝 发布于 2015年3月27日. 估计阅读时间: 8 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

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的功能,比如值类型(结构体)和值类型(如值类型或原生类型)的泛型增强。这些何时加入还都没有时间表,但是思考和调研将会促进这些功能在未来的某一时刻加入的可能性。

值类型是一种代表数据的固定结构,就像一个类。然而与类(引用)不同,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


感谢赵震一对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

内容重复 by see sai

Mark Reinhold还讨论了未来有可能加入JVM的功能,比如值类型(结构体)和值类型(如值类型或原生类型)的泛型增强。这些何时加入还都没有时间表,但是思考和调研会促进这些功能在未来的某一时刻加入的可能性。Mark Reinhold还讨论了未来有可能加入JVM的功能,比如值类型(结构体)和值类型(如值类型或原生类型)的泛型增强。这些何时加入还都没有时间表,但是思考和调研将会促进这些功能在未来的某一时刻加入的可能性

Re: 内容重复 by Ding Alice

搞定啦。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT