欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java9的一些新特性介绍

程序员文章站 2024-03-05 15:52:25
被接受的特性 1. jigsaw 项目;模块化源码 jigsaw项目是为了模块化java代码、将jre分成可相互协作的组件,这也是java 9 众多特色种的一个。jep...

被接受的特性
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);
  }
}

在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

更多关于 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暂时还没有.