生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

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:393151

评论

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

云图说|应用魔方AppCube:揭秘码农防脱神器

华为云开发者联盟

低代码 华为云 AppCube 云图说 应用魔方

银行4.0时代的营销与风控之路

索信达控股

大数据 金融科技 数字化转型 银行数字化转型 营销数字化

字节跳动有状态应用云原生实践

火山引擎开发者社区

云原生 后端

程序员如何提高开发效率?

万事ONES

项目管理 程序员 敏捷开发 ONES

Go 学习笔记之 字符串数据类型

架构精进之路

Go 语言 7月日更

共36万字!为上岸Alibaba,我把Github上Java面试题都整理了一遍

Java 编程 程序员 架构 面试

mPaaS 月度小报 | CodeDay#6 成都站落幕,下一站北京;上新季:新容器、新官网、新视觉

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS

云端赛车-Amazon DeepRacer 的前世今生

亚马逊云科技 (Amazon Web Services)

人工智能 开源

腾讯上线零点巡航,用Java手撕一个人脸识别系统

北游学Java

Java 腾讯 人脸识别

手把手教你实现聚光灯效果

ThingJS数字孪生引擎

大前端 可视化 智能灯控 数字孪生

MySQL连接数管理

Simon

MySQL

CDH 安装搭建(二)

大数据技术指南

CDH 7月日更

记某百亿级mongodb集群数据过期性能优化实践

杨亚洲(专注MongoDB及高性能中间件)

Java MySQL 数据库 mongodb 分布式数据库mongodb

Java项目实战营总结

eoeoeo

JAVA 九种排序算法详解(下)

加百利

Java 数组 排序 7月日更

部分简单网页的基础了解

Emotion

html html5 Html报文解析 内部样式、 CSS语法

监测生命体征、活动水平的可穿戴电子产品设计方案

不脱发的程序猿

物联网 ADI 可穿戴电子产品设计方案 监测生命体征、活动水平 智能传感器

对EF Core进行扩展使支持批量操作/复杂查询

Spook

EF Core

linux网络编程—7层网络以及5种Linux IO模型以及相应IO基础

Linux服务器开发

后端 网络编程 Linux服务器开发 网络模型 IO模型

区块链时代下,企业如何打造数据要素的“新竞争力”?

旺链科技

大数据 产业区块链

阿里的架构师一致好评!IT界首版全栈架构师全栈“成长笔记”开源!

Java架构追梦

Java 阿里巴巴 架构 面试 成长笔记

Hive学习笔记(一)

五分钟学大数据

hive 7月日更

这套获50w+星标的算法神仙文档,足你解决90%的对手,牛逼

编程 程序员 架构 面试

数据归档 - 冷热数据处理大师

趣链科技

数据处理 区块链+

QuFi挖矿APP开发|QuFi挖矿系统软件开发

手机如果能折叠能卷的话,电脑为什么不能呢?

船医特拉法尔加

开发者 工具 柔性屏

渗透工程师必看-网络安全法条例-国家安全法介绍和案例

学神来啦

运维 黑客 安全 渗透

卧薪尝胆30天!啃透京东大牛的高并发设计进阶手册,终获P7意向书

Java 编程 程序员 架构 面试

云原生打包工具:Buildpacks

QiLab

Docker 云原生 k8s buildpacks

爱了!阿里巴巴 Java 面试参考权威指南(泰山版)5月版开源

Java 编程 程序员 架构 面试

开源即巅峰!阿里首次分享:Java架构师全栈“成长笔记”

Java架构师迁哥

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