2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

评论

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

WorkPlus高端制造业数字化解决方案—中集集团

BeeWorks

企业 即时通讯 协同办公 开源软件

Polar Network/PN币挖矿APP系统开发搭建

袋鼠云:基于Flink构建实时计算平台的总体架构和关键技术点

Apache Flink

flink

亚马逊云科技携手 Vodafone Business 向欧洲企业推广边缘计算

亚马逊云科技 (Amazon Web Services)

便捷赔付,自在出行!亚马逊云科技助力车险业务因“云”而变

亚马逊云科技 (Amazon Web Services)

全球对话式AI平台评估报告出炉 Gartner:百度位居领先阵营

百度大脑

人工智能 智能客服

IPFS矿机多少钱1T?IPFS矿机多少钱一台?

分布式存储 IPFS fil fil矿机 ipfs矿机

2021挚物· AIoT 产业领袖峰会亮点:EMQ 映云科技赋能传统工业

EMQ映云科技

物联网 AIOT 云边一体 边云协同

阿里“保姆级”教程,这份SpringBoot应用到实战手册,满满的精华

Java架构师迁哥

Lamda(拉姆达)表达式演化过程

叫练

jdk8 JDK1.8新特性

利用亚马逊云科技的 Cloudify 实施 5G 网络切片

亚马逊云科技 (Amazon Web Services)

《计算机网络 PDF》搞起!

苹果看辽宁体育

大前端 后端 计算机网络

云原生数据库的幕后英雄—浅谈分布式数据库的计算和存储分离

速拼商城APP系统开发介绍

高能预警!以阿里社招前端面试为例,详讲面对面试官到面试中到面试结束

前端依依

程序员 面试 大前端 阿里 经验分享

乐活星球系统APP开发简介

OD万基国际系统软件开发搭建

ONE红地球/ONE Network系统APP开发费用

网易云信线上万人连麦技术大揭秘

网易云信

网易 视频 音频技术

Magician 1.1.16 is released, the handler adopts annotation configuration

Magician网络编程包

Java nio

架构训练营 - 模块二 - 作业

姑射仙人

架构训练营

“低代码开发”与“传统IT开发”的区别是什么?

优秀

低代码

2021年6月券商App行情刷新及交易体验评测报告

博睿数据

博睿数据 博睿指数 券商App

模块二作业:微信朋友圈高性能复杂度架构设计

Felix

Pravega Flink connector 的过去、现在和未来

Apache Flink

flink

U评海洋软件系统开发搭建

智能合约DAPP系统开发技术搭建

薇電13242772558

区块链 智能合约

如何实现70%丢包下音视频的高可用-信令篇

ZEGO即构

音视频 弱网 QUIC协议

批量下载gitlab代码

阿呆

#GitLab

捕货拼团软件系统开发详情

DMDOGEplus钻石狗软件系统开发需求

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