写点什么

Mark Reinhold 谈“Java9 及其未来”

  • 2015-03-26
  • 本文字数:2293 字

    阅读完需:约 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.Encoder java.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 的已有实现 JNA JNR 提出的。他最后总结说,Java 在不断演化,并有节奏地定位大问题:在 Java 5 中引入泛型,在 Java 8 中引入 lambda 表达式,并在 Java 9 中引入模块化,它像激光一样聚焦于向后兼容性,以免破坏已经存在的代码或客户。

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


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

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

2015-03-26 06:393718

评论

发布
暂无评论
发现更多内容

马士兵「研发」对标阿里Java架构师P5—P9成长路线,文档+教程

Java架构追梦

Java 数据库 架构 JVM 多线程与高并发

差之毫厘:etcd 3 完美支持 HTTP 访问?

API7.ai 技术团队

etcd 网关 APISIX

一周信创舆情观察(7.19~7.25)

统小信uos

330页PDF,10万字的知识点总结,架构师必备!

欢喜学安卓

android 程序员 面试 移动开发

裸辞后吊打大厂面试官,四面拿到阿里offer后我还是选择了美团

java小李

tomcat elasticsearch

抖音获客APP开发,抖音获客系统开发(成功案例),抖音获客系统源码

系统开发咨询1357O98O718

详解云安全攻防模型,这些攻击战略和战术越早知道越好!

博文视点Broadview

分布式性能测试框架用例方案设想(一)

FunTester

性能测试 接口测试 测试框架 测试开发 分布式压测

逆袭成功,不愧是阿里内部面试参考指南,已帮我拿下了8个大厂的offer

Java 程序员 架构 面试 计算机

花朵分类(一)

毛显新

深度学习 tensorflow keras

GitHub万人斩!Java系列面试宝典,我拿到之后直接反杀了面试官

java小李

git cherry-pick

Tensorflow serving with docker

毛显新

tensorflow Docker

索信达控股:探寻金融数字化转型契机下的高增长“密码”

索信达控股

直播时各种背景是怎么实现的?聊一聊虚拟背景背后的技术

阿里云CloudImagine

阿里云 计算机视觉 视频会议 虚拟背景 人像抠图

基于docker的分布式性能测试框架功能验证(一)

FunTester

性能测试 接口测试 测试框架 测试开发 分布式压测

短视频SEO获客系统软件开发简介

短视频营销获客软件系统开发内容

只出现一次的数字

Memorys

Java 面试 算法

短视频SEO软件系统开发资料

5年经验Android程序员面试27天,从理论到实践!

欢喜学安卓

android 程序员 面试 移动开发

10天拿到腾讯Android岗offer,大厂直通车!

欢喜学安卓

android 程序员 面试 移动开发

询盘获客软件系统开发详情

搜客系统软件开发公司

Go语言:如何通过 RPC 来实现跨平台服务!

微客鸟窝

Go 语言

直呼内行!靠着这份阿里10w字面试总结,我成功收到了4个大厂offer

Java 程序员 架构 面试 计算机

仅仅上线一小时,下载量就破10W!阿里内部Java性能优化实战手册

java小李

面试 JVM

浅谈工业4.0背景下的空中数据端口,无人机 3D 可视化系统的应用

一只数据鲸鱼

无人机 数据可视化 工业4.0 数字孪生 智慧工业

【共识专栏】共识的分类(上)

趣链科技

区块链 联盟共识 共识机制 共识算法

短视频询盘软件系统开发内容

抖音获客系统开发(软件开发),抖音获客源码模式

系统开发咨询1357O98O718

后端开发-Reactor设计模式

Linux服务器开发

reactor 设计模式 网络编程 线程池 epoll

Mark Reinhold谈“Java9及其未来”_Java_Alex Blewitt_InfoQ精选文章