写点什么

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

评论

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

产品故事|你所不知道的语雀画板

编辑器 思维导图 SaaS 企业知识管理工具

蜜月期过后,跨境电商的出口在哪里?亚马逊云科技全新洞察发布

Lily

ShardingSphere 异构迁移最佳实践:将3.5亿量级的顾客系统 RTO 减少60倍

SphereEx

Java php MySQL 数据库 ​Apache ShardingSphere

如何实现十亿级离线 CSV 导入 Nebula Graph

NebulaGraph

知识图谱 数据导入 Nebula Graph CSV 文件导入

本周二晚19:00战码先锋第5期直播丨深入理解OpenHarmony系统启动,轻松踏上设备软件开发之旅

OpenHarmony开发者

OpenHarmony

本地开发测试,局域网中使用IP地址访问项目网站

迷彩

网站架构 学习记录 网站开发 6月月更

在线帮助中心对企业的作用及解决方案

小炮

蓝凌叮当刘向华:如何用一款SaaS俘获年轻人的心?

ToB行业头条

国际权威报告:SaaS+AI大势所趋,腾讯云领跑国内科技公司

科技热闻

《正面管教》:如何科学地管教孩子?

郭明

读书笔记

Java—线程

武师叔

6月月更

从无到有,政务系统的全面可观测模板

博睿数据

智能运维 博睿数据 政务系统 全面检测

改变世界的开发者丨黑客松冠军,为听障儿童推开一扇“有声的窗”

华为云开发者联盟

云计算 华为云 GaussDB 听觉 听障儿童

秒云与趋动科技联合发布容器云平台与GPU资源池化整体解决方案

MIAOYUN

人工智能 容器 云原生 容器化 容器云平台

fitfi运动赚钱链游系统开发模式详情

开发微hkkf5566

“躺着都能赚钱”的时代已经过去,亚马逊云科技为跨境电商找到下一个爆点

Lily

【网络安全】VPN是什么?VPN与堡垒机有啥区别?

行云管家

网络安全 堡垒机 vpn

全国超10亿用户!AntDB数据库的电信核心交易替换之路

亚信AntDB数据库

数据库 通信 电信 运营商 数据库应用开发

想发自己的NFT,你要先搞清楚这6个问题

华为云开发者联盟

区块链 数据资产 NFT

腾讯云小微技术登顶权威榜单XTREME基准,跨语言技术迁移开发助力企业出海

科技热闻

【真相】大厂招人不怕花钱的原因竟然是。。。

博文视点Broadview

实战 | SpringBoot+MySQL事务/行级锁实现商品减库存

写程序的小王叔叔

微服务 事务 MySQL 数据库 6月月更 事务/行级锁

致力超表面光子芯片产品研发与制造,山河光电完成数千万元Pre-A轮融资

硬科技星球

山河光电

面试突击56:聚簇索引和非聚簇索引有什么区别?

王磊

Java MySQL 面试

全球云计算市场持续发力,但云身份管理能力认可度不足3成

行云管家

云计算 云服务 企业上云 混合云 多云

游泳馆应用软件开发:在线一站式服务,优化用户整体体验

开源直播系统源码

软件开发 APP开发 直播系统

【LeetCode】高度检查器Java题解

Albert

LeetCode 6月月更

java培训如何让SpringBoot支持Jsp

@零度

JAVA开发 spring-boot

Wallys/Network_Card/DR-NAS26/AR9223/2x2 MIMO

wallys-wifi6

PostgreSQL精品学习资源合集(含基础手册、实操技巧&案例、书籍推荐)

墨天轮

数据库 postgresql

Mybatis省略@Param注解原理

mybatis 6月月更 @Param注解

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