AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

评论

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

工信部电子标准院:龙蜥操作系统获评“优秀”

OpenAnolis小助手

工信部 开源项目 获奖 龙蜥操作系统 生态构建

技术如何分担产品之忧?

石云升

极客时间 1月月更 技术领导力实战笔记

极客时间运维进阶训练营第十二周作业

9527

CleanMyMacX4.12.2最新版本更新下载

茶色酒

CleanMyMacX

复习前端:前端安全

devpoint

CSRF xss攻击 前端安全

复习前端:JavaScript V8 引擎机制

devpoint

chrome JIT V8

工作这么多年,我总结的数据传输对象 (DTO) 的最佳实践

JAVA旭阳

Java 架构

复习前端:前端应掌握的网络知识

devpoint

OSI七层协议 http2 HTTPS协议加密

架构误区系列12:一切皆依赖云平台

agnostic

云计算 部署架构

【PHP】英文博客专栏PHP快速入门个人笔记

懒时小窝

php

2022年终总结-无所吊谓

wood

年终总结 稳定 开心 普通的一年

水果软件2024FL Studio中文语言版本下载

茶色酒

FL Studio FL Studio 21

你知道哈希算法,但你知道一致性哈希吗?

JAVA旭阳

Java 架构

JSON.stringify() 的 5 使用场景

devpoint

JavaScript 前端开发 JSON格式化

CleanMyMac X2024汉化版安装包新增

茶色酒

CleanMyMac X CleanMyMac X2023

Kratos微服务框架API工程化指南

golang gRPC microservice Kratos 工程化

如何快速优雅的用Know Streaming创建Topic

石臻臻的杂货铺

获取 topic等信息 后端、

Python 内置界面开发框架 Tkinter入门篇 甲

eng八戒

Python GUI tkinter

万字长文搞懂产品模式和项目模式

俞凡

团队管理

关于环境变量配置的思考总结

timerring

Go 环境变量

【Java应用服务体系】「序章入门」全方位盘点和总结调优技术专题指南

码界西柚

Java 技术分析 应用调优 优化指南

Best Wishes「兔」You!

阿里云CloudImagine

从员工批量离职中,认识管理的价值

石云升

极客时间 1月月更 技术领导力实战笔记

Studio One2024旗舰级DAW的跨版本升级

茶色酒

Studio One 5 Studio One2023

精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

码界西柚

Java JVM JVM原理 2023

技术管理者如何获得下属的认同?

石云升

极客时间 1月月更 技术领导力实战笔记

WSL中使用vcpkg安装pcl库出现编译失败的原因

大伟

架构误区系列11:无聊的架构归一

agnostic

架构治理

Portraiture2024汉化版磨皮插件下载

茶色酒

Portraiture2023 Portraiture

【Linux技术专题系列】「必备基础知识」一起探索和实践sftp配置之密钥方式登录

码界西柚

Linux SSH SSH工具 sftp

开源移动核心网Magma架构设计启示

俞凡

架构 网络 通信

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