Java 9 – 终极特性列表
本文会根据针对即将发布的 Java 9 新特性做同步更新 (最后更新:9/9/2014)
加快 OpenJDK 的开发速度: 继 2014 年 3 月份发布了 Java 8 之后,我们进入下一个两年的发布周期. Java 9 预计在 2016 年发布,并且已经公布了 JEP(JDK 改进提议) 中的前期列表.同时,我们已经把一些新特性整理到了 JSR(Java 规范请求),还有提出了一些希望包括在新版本中的其他特性.
这些重要的特性都包括在 Jigsaw 项目中。显著的性能改善和期待已久的 API 包括:进程 API 更新,JSON 将成为 java.util 的一部分,货币处理 API.对于想处在技术最前沿的你,可从这里获得 Java 9 的初期版本.
本文将根据 Java 9 的新特性做持续更新。敬请关注!
被接受的特性
1. Jigsaw 项目;模块化源码
Jigsaw 项目是为了模块化 Java 代码、将 JRE 分成可相互协作的组件,这也是 Java 9 众多特色种的一个。JEP 是迈向 Jigsaw 四步中的第一步,它不会改变 JRE 和 JDK 的真实结构。JEP 是为了模块化 JDK 源代码,让编译系统能够模块编译并在构建时检查模块边界。这个项目原本是随 Java 8 发布的,但由于推迟,所以将把它加到 Java 9.
一旦它完成,它可能允许根据一个项目需求自定义组件从而减少 rt.jar 的大小。在 JDK 7 和 JDK 8 的 rt.jar 包中有大约 20,000 个类,但有很多类在一些特定的环境里面并没有被用到 (即使在 Java 8 的紧凑分布特性中已经包含了一部分解决方法也存在着类冗余)。这么做是为了能让 Java 能够容易应用到小型计算设备 (比如网络设备) 中,提高它的安全和性能,同时也能让开发者更容易构建和维护这些类库。
2. 简化进程 API
截止到目前,Java 控制与管理系统进程的能力是有限的。举个例子,现在为了简便获取你程序的进程 PID,你要么调用本地程序要么要自己使用一些变通方案。更多的是,每个(系统)平台需要有一个不同实现来确保你能获得正确的结果。
期望代码能获取 Linux PIDS,现在是如下方式:
public static void main(String[] args) throws Exception
{
Process proc = Runtime.getRuntime().exec(new String[]{ "/bin/sh", "-c", "echo $PPID" });
if (proc.waitFor() == 0)
{
InputStream in = proc.getInputStream();
int available = in.available();
byte[] outputBytes = new byte[available];
in.read(outputBytes);
String pid = new String(outputBytes);
System.out.println("Your pid is " + pid);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在 Java 9 中,可以变换成如下方式(支持所有的操作系统):
System.out.println("Your pid is " + Process.getCurrentPid());
这次更新将会扩展 Java 与操作系统的交互能力:新增一些新的直接明了的方法去处理 PIDs,进程名字和状态以及枚举多个 JVM 和进程以及更多事情。
3. 轻量级 JSON API
目前有多种处理 JSON 的 Java 工具,但 JSON API 独到之处在于 JSON API 将作为 Java 语言的一部分,轻量并且运用 Java 8 的新特性。它将放在 java.util 包里一起发布 (但在 JSR 353 里面的 JSON 是用第三方包或者其他的方法处理的).
代码例子稍后列出!
4. 钱和货币的 API
在 Java 8 引进了日期和时间的 API 之后, Java 9 引入了新的货币 API, 用以表示货币, 支持币种之间的转换和各种复杂运算. 关于这个项目的具体情况, 请访问 https://github.com/JavaMoney,里面已经给出了使用说明和示例, 以下是几个重要的例子:
//新的类型: Money & FastMoney
Money amt1 = Money.of(10.1234556123456789, "USD"); // Money is a BigDecimal
FastMoney amt2 = FastMoney.of(123456789, "USD"); // FastMoney is up to 5 decimal places
Money total = amt1.add(amt2);
// 钱表达成各国货币的方法:
MonetaryAmountFormat germanFormat = MonetaryFormats.getAmountFormat(
Locale.GERMANY);
System.out.println(germanFormat.format(monetaryAmount)); // 1.202,12 USD
2
3
4
5
6
7
8
9
10
5. 改善锁争用机制
锁争用是限制许多 Java 多线程应用性能的瓶颈. 新的机制在改善 Java 对象监视器的性能方面已经得到了多种基准 (benchmark) 的验证, 其中包括 Volano. 测试中通讯服务器开放了海量的进程来连接客户端, 其中有很多连接都申请同一个资源, 以此模拟重负荷日常应用.
通过诸如此类的压力测试我们可以估算 JVM 的极限吞吐量 (每秒的消息数量). JEP 在 22 种不同的测试中都得到了出色的成绩, 新的机制如果能在 Java 9 中得到应用的话, 应用程序的性能将会大大提升.
6. 代码分段缓存
Java 9 的另一个性能提升来自于 JIT(Just-in-time) 编译器. 当某段代码被大量重复执行的时候, 虚拟机会把这段代码编译成机器码 (native code) 并储存在代码缓存里面, 进而通过访问缓存中不同分段的代码来提升编译器的效率.
和原来的单一缓存区域不同的是, 新的代码缓存根据代码自身的生命周期而分为三种:
永驻代码 (JVM 内置 / 非方法代码)
短期代码 (仅在某些条件下适用的配置性 (profiled) 代码)
长期代码 (非配置性代码)
缓存分段会在各个方面提升程序的性能, 比如做垃圾回收扫描的时候可以直接跳过非方法代码 (永驻代码), 从而提升效率.
7. 智能 Java 编译, 第二阶段
智能 Java 编译工具 sjavac 的第一阶段开始于JEP 139这个项目, 用于在多核处理器上提升 JDK 的编译速度. 现在这个项目已经进入第二阶段 (JEP 199), 目的是改进 sjavac 并让其成为取代目前 JDK 编译工具 javac 的 Java 默认的通用编译工具.
其他值得期待的内容:
8. HTTP 2.0 客户端
HTTP 2.0 标准虽然还没正式发布, 但是已经进入了最终审查阶段, 预计可以在 Java 9 发布之前审查完毕. JEP 110将会重新定义并实现一个全新的 Java HTTP 客户端, 用来取代现在的 HttpURLConnection, 同时也会实现 HTTP 2.0 和网络接口 (原文 websockets). 它现在还没被 JEP 正式认可但我们希望在 Java 9 中包含这一项目的内容.
官方的 HTTP 2.0 RFC(Request for Comments, 官方技术讨论/会议记录等等的一系列文档记录) 预订于 2015 年 2 月发布, 它是基于 Google 发布的 SPDY(Speedy, 快速的) 协议. 基于 SPDY 协议的网络相对于基于 HTTP 1.1 协议的网络有 11.81% 到 47.7% 之间的显著提速, 现在已经有浏览器实现了这个协议.
9. Kulla 计划: Java 的 REPL 实现
这个取名为 Kulla 的项目最近宣布将于 2015 年 4 月整合测试, 虽然已经不太有希望能赶上 Java 9 的发布, 但如果进度快的话或许刚好能赶上. 现在 Java 并没有来自官方的 REPL(Read-Eval-Print-Loop) 方式, 也就是说现在如果你想要跑几行 Java 代码做一个快速的测试, 你仍然需要把这几行代码封装在项目或者方法里面. 虽然在一些流行的 IDE 里面有 Java REPL 工具, 但它们并没有官方支持, 而 Kulla 项目或许就能成为 Java 官方发布的 REPL 解决方案.