Java9–终极特性列表

澳门新浦京8455com 1

预计发布的Java 9中,最令人兴奋的特性是什么?

有关Java9的消息最近显得有些沉寂,不要被它迷惑了。JDK开发者正在努力朝着下一个版本迈进,计划2015年12月前完成所有功能开发。之后,它会经历严格测试和bug修复以准备它的全面上市,按计划会在2016年9月发布。

今天我们已经对Java 9中所期待的特性有了一个很清晰的图景。如果Java
8可以被描述为主要是lambdas表达式、streams和API变化的话,那么Java
9就是关于Jigsaw、额外的实用工具和内部的变化。在这篇文章中,收集了一些我们认为是Java
9中最期待的特性——除了通常的猜测之外,Jigsaw项目,承担了打破JRE并对Java核心组件模块化的使命。

这里有一些特性是Java
9中绝对必要了解的,其中的一些已经在早期的发布版本中为你捣鼓做好了准备。

澳门新浦京8455com 1

1.Java + REPL = jshell

是的。之前我们怀疑Kulla项目是否会在Java
9中准时发布,但现在已得到了官方确认。下一版发布的Java将会有称为jshell的新命令行工具,它会添加本地支持和以Java方式对REPL(交互式解释器)进行推广。意思是说,如果你想只运行几行Java代码,你不必把它包装进一个单独的工程或者方法。

噢,你可以忘掉那些分号了:

-> 2 + 2
| 表达式的值是4
| 将临时变量$1的类型设为int

还有一些像REPL加载项一样的替代品会增加到流行的IDE和解决方案中,就像Java
REPL网页控制台。但目前为止,还没有官方的或者合适的方式来这么做。jshell在早期的版本中已经可以用了,等着你给它来个测试运行。

加快OpenJDK的开发速度:继2014年3月份发布了Java
8之后,我们进入下一个两年的发布周期。 Java
9预计在2016年发布,并且已经公布了JEP(JDK改进提议)中的前期列表。同时,我们已经把一些新特性整理到了JSR(Java规范请求),还有提出了一些希望包括在新版本中的其他特性。

2、微基准测试要来了

由Alexey Shipilev开发的Java微基准测试套件(Java Microbenchmarking
Harness澳门新浦京8455com ,)正在其进化的下一阶段,并加入Java作为官方基准解决方案。我们真的很喜欢在Takipi做基准,所以一套标准化的执行方式是我们期待的。

JHM是一组用来编译、运行和分析nano/micro/milli/macro基准的套件。当涉及到精确基准评估,对结果产生很大影响的能力将备受关注,比如预热时间和优化。当你以微秒或纳秒计时的情况下尤其如此。所以,如果你想要更加精确的结果来帮助跟踪基准以做出正确的决定,JMH是你的最佳选择——并且现在它已经成为Java
9的同义词了。

这些重要的特性都包括在Jigsaw项目中。显著的性能改善和期待已久的API包括:进程API更新,JSON将成为java.util的一部分,货币处理API对于想处在技术最前沿的你,可从这里获得Java
9的初期版本。

3、G1会成为新的默认垃圾收集器吗?

我们经常听说的一个误解是:Java只有一个垃圾收集器,而事实上它有4个。Java
9中,仍有一个运行提议,关于替换由Java
7引入的G1默认垃圾收集器(并行/吞吐量收集)的讨论。不同收集器之间差别精简概述,可以查看这篇里的文章。

通常来说,G1被设计来更好地支持大于4GB的堆,并且不会造成频繁的GC暂停,但当暂停发生时,往往会处理更长时间。最近我们和Outbrain的性能专家Haim
Yadid讨论了关于GC的方方面面,来帮助你了解更多各收集器之间不同的权衡。同样,如果你想要深入了解相关讨论,那么hotspot-dev和jdk9-dev的邮件组是个开始学习不错的地方。

被接受的特性

4、未来是HTTP 2.0

官方的HTTP
2.0标准是几个月之前被批准的,基于Google的SPDY算法构建。SPDY已经展示了相对HTTP
1.1巨大的速度提升,范围在11.81%到47.7%之间,并且它已经存在于大多数现代的浏览器中了。Java
9将全面支持HTTP
2.0,并且为Java配备一个全新的HTTP客户端来替代HttpURLConnection,并且同时还实现HTTP
2.0和websockets。

  1. Jigsaw 项目;模块化源码

5、进程API得到了巨大的推动

到目前为止,通过Java来控制和管理操作系统进程能力有限。例如在早期版本的Java中,为了做一些简单的事情,像得到进程PID,要么访问本机代码,要么用某种神奇的临时解决方法。此外,还可能需要一个对于每个平台提供不同实现来保证你得到正确的结果。

在Java 9中,除了获取Linux PID的代码,现在都像这样来获取:

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);
    }
}

转向像这样的代码(同样也支持所有的操作系统):

System.out.println("Your pid is" + Process.getCurrentPid());

这一更新将扩展Java与操作系统交互的能力:全新的直接操作PID、进程名和状态的方法,操作JVM线程和进程等等能力。

Jigsaw项目是为了模块化Java代码、将JRE分成可相互协作的组件,这也是Java 9
众多特色种的一个。JEP是迈向Jigsaw四步中的第一步,它不会改变JRE和JDK的真实结构。JEP是为了模块化JDK源代码,让编译系统能够模块编译并在构建时检查模块边界。这个项目原本是随Java
8发布的,但由于推迟,所以将把它加到Java 9.

你不会在Java 9中见到什么?

我们以为两个有趣的特性会作为即将到来的Java发布版本中的一部分——但现在我们知道它们将不会出现在这次发布的版本。

一旦它完成,它可能允许根据一个项目需求自定义组件从而减少rt.jar的大小。在JDK
7 和JDK
8的rt.jar包中有大约20,000个类,但有很多类在一些特定的环境里面并没有被用到(即使在Java
8的紧凑分布特性中已经包含了一部分解决方法也存在着类冗余)。这么做是为了能让Java能够容易应用到小型计算设备(比如网络设备)中,提高它的安全和性能,同时也能让开发者更容易构建和维护这些类库。

1、一个标准的轻量级JSON API

在我们进行的一项对350名开发人员的调查中,JSON
API就像Jigsaw一样被大肆宣传,但看起来它好像没在发布版本中,原因可能是资金问题。Mark
Reinhold,Java平台的首席架构师,在JDK
9的邮件列表中写到:

“这个JEP对于平台来说是个有益的补充,但长远来看,考虑到资金的因素以及Oracle资助的其它特性,它并不如其它特性一样重要。我们考虑可能在JDK
10或者之后的版本再发布这个JEP。”

2. 简化进程API

2、金钱和货币API

有一条新闻,似乎看起来金钱和货币API也缺少Oracle的支持。这是我们从Anatole
Tresch那里得到的答案,这个API的产品推广师:

@tkfxin
目前不会。从Oracle那里没得到支持。取而代之的,我们将提高Java EE支持并且spring也将支持它
澳门新浦京8455com 2

– Anatole Tresch (@atsticks) 2015年6月16日

我们遗漏了什么吗?请在下面的评论区告诉我们吧。没有空闲时间?来看看何时以及为何在产品中代码会出现失败中断。

截止到目前,Java控制与管理系统进程的能力是有限的。举个例子,现在为了简便获取你程序的进程PID,你要么调用本地程序要么要自己使用一些变通方案。更多的是,每个平台需要有一个不同实现来确保你能获得正确的结果。

期望代码能获取Linux PIDS,现在是如下方式:

在Java 9中,可以变换成如下方式:

这次更新将会扩展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,
用以表示货币, 支持币种之间的转换和各种复杂运算. 关于这个项目的具体情况,
请访问,里面已经给出了使用说明和示例, 以下是几个重要的例子:

更多关于 JSR 354的内容

5. 改善锁争用机制

锁争用是限制许多Java多线程应用性能的瓶颈.
新的机制在改善Java对象监视器的性能方面已经得到了多种基准(benchmark)的验证,
其中包括Volano. 测试中通讯服务器开放了海量的进程来连接客户端,
其中有很多连接都申请同一个资源, 以此模拟重负荷日常应用.

通过诸如此类的压力测试我们可以估算JVM的极限吞吐量(每秒的消息数量).
JEP在22种不同的测试中都得到了出色的成绩, 新的机制如果能在Java
9中得到应用的话, 应用程序的性能将会大大提升.

关于JEP 143的更多内容

6. 代码分段缓存

Java 9的另一个性能提升来自于JIT(Just-in-time)编译器.
当某段代码被大量重复执行的时候, 虚拟机会把这段代码编译成机器码(native
code)并储存在代码缓存里面,
进而通过访问缓存中不同分段的代码来提升编译器的效率.

和原来的单一缓存区域不同的是,
新的代码缓存根据代码自身的生命周期而分为三种:

永驻代码(JVM 内置 /
非方法代码)短期代码(仅在某些条件下适用的配置性(profiled)代码)长期代码(非配置性代码)

缓存分段会在各个方面提升程序的性能,
比如做垃圾回收扫描的时候可以直接跳过非方法代码(永驻代码), 从而提升效率.

更多关于JEP 197的内容

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解决方案.

更多关于Kulla计划的内容

这些新功能出自何处?

JEP和JSR并不是无中生有,下面就介绍一下Java发展的生态环境:

小组 – 对特定技术内容,
比如安全、网络、Swing、HotSpot、有共同兴趣的组织和个人。

项目 – 编写代码,
文档以及其他工作,至少由一个小组赞助和支持,比如最近的Lambda计划,Jigsaw计划和Sumatra计划。

JDK改进提案(JEP) – 每当需要有新的尝试的时候, JEP可以在JCP(Java
Community
Process)之前或者同时提出非正式的规范(specification),被正是认可的JEP正式写进JDK的发展路线图并分配版本号。

Java规范提案(JSR) – 新特性的规范出现在这一个阶段,可以来自于小组 /
项目、JEP、
JCP成员或者Java社区(community)成员的提案,每个Java版本都由相应的JSR支持,
Java 9暂时还没有。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图