Oracle 规范要点以及 IBM 的性能、可靠性和服务性增值服务
简介: 倍受期待的 Java™ SE 7 最终版预计将包括针对语言和虚拟机所有方面的增强。Oracle 和 IBM 已经发布了各自实现的 Early Access 下载,供评估和反馈。在本文中,IBM Java 技术中心 Java 服务战略架构师 Chris Bailey 将介绍库中的一些变化,包括 Oracle 规范和 IBM 提供的增值服务。
预计于今年秋天将最终发布的 Java 平台最新更新意义重大且倍受期待。虽然尚未通过 Java Community Process (JCP) 正式创建 Java 7 平台 Java Specification Request (JSR),并且最终特性集仍然未知,但 Oracle 推出的 Early Access 下载(参见 参考资料)以及 Oracle 团队的公开声明为我们理解 Java SE 7 的内容提供了一些帮助。
预计特性分为以下四类:
非 Java 语言支持和 JSR 292
Java 7 将提供一些增强,可允许动态类型语言的编译器实现程序更加轻松地为 Java 运行时生成实现,并允许这些实现以更高的性能运行。JSR 292 是变化的推动力。它引入了新的字节码和一系列新的 Java 类。
大多数情况下,Java 语言是强类型的,这需要指定在方法中传递或返回的参数类型。但是,在字节级,Java 则更加偏向于弱类型:操作数栈中的变量仅在属于相关原始类型或者一般为对象引用时才需要指定类型。在几乎所有情况中,字节级都使用弱类型。方法调用是一种例外情况,它会强制使用强类型 — 也就是说,调用方法时将使用它的完整签名,这包括参数和返回类型。在这种情况下,需要使用已知 Java 类型对 Java 方法进行调用。这会对动态语言造成问题,比如 Ruby、Python 和 Groovy,因为它们是动态类型(类型仅在运行时为可知)。
可以采用一些机制(通常基于反射或使用生成的调用程序)来避免这些问题并允许在 JVM 上运行动态语言,但它们会受到显著的性能影响。JSR 292 的引入旨在通过添加新 Java 字节码 invokedynamic 以调用动态方法,并结合 Java 语言关联机制来处理允许在运行时重写方法结构,来解决这些问题。
“易于开发” 特性
与 Java 平台之前的发行版相同,许多新语言特性将帮助简化常用结构所需的语法。
Project Coin
Project Coin 涵盖众多小变化(coins),旨在降低编写简单任务的复杂度,并改善生成代码的可读性。
switch
语句中的 String
switch
语句中使用 String
或 Object
。这意味着对 String
执行 switch
式语句的唯一方法是使用一系列 if
-then
-else
语句或者将 String
转换为原始类型或 enum
类型。String
在 switch
语句中的使用意味着以下简单结构现在已经合法: switch (myString) { case "one": <do something>; break; case "red": <do something else>; break; Default: <do something generic>; } |
Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); |
Map<String, List<String>> anagrams = new HashMap<(); |
varargs
方法调用 int[] array = new int[] {0,1,2,3,4,5} |
List<String> numbers = ["one", "two", "three", "four", "five"]; |
try
语句,用于声明一个或多个必须手动关闭的资源;例如,InputStream
或者 OutputStream
。全新的 try
语法意味着,语句完成之后,所声明的资源将自动关闭: static String readFromFile (String file) throws IOException { try (BufferedReader reader = new BufferedReader(new FileReader(file)) { return reader.readLine(); } // resources are automatically closed here } |
闭包(非 Coin)
包括 Scheme、Ruby 和 SmallTalk 在内的许多编程语言都允许使用闭包或 lambda 函数。闭包实现有望添加在最终 Java 7 规范中;但是,详细实现尚不明确,因为有多个有竞争力的提议。
模块性支持
在每个新版本的 Java 平台中,SDK 的体积都有所增长 — 这一副作用是由各种环境中可用功能增加造成的。虽然许多功能都是资源,但过大的体积和复杂性会不可避免地影响一些关键性能指标:下载大小、启动时间和内存占用。
为了解决这些问题,Java 7 计划提供一个模块化 JDK 运行时,即 Project Jigsaw。它将允许用户仅下载和加载运行应用程序所需的组件。此外,用户将能够将模块性应用到库和应用程序。最终实现尚未确定。
可伸缩性更新
随着多核系统的日益普及,以及这些系统中的内核数量不断增加,Java 语言向可伸缩性方面发展也是大势所趋。扩展是指开发人员需要访问可伸缩的集合、数据结构和算法。Java 语言在版本 7 中延续了在可伸缩性方面的增强,主要体现在两个特性中: 全新的 I/O 2 以及 Concurrency 和 Collections 更新。
全新的 I/O 2
Java 平台 1.4 发行版在 JSR 51 下引入了一组全新的 I/O (NIO) API,旨在允许开发可高度伸缩的 I/O,而不需要开发本地代码。JSR 51 主要专注于缓冲和渠道,并且提供了非阻塞复用 I/O。在版本 7 中,我们在 JSR 203 下加入了(全新的)New I/O API (NIO.2),从而进一步扩展了在 1.4 中开始的工作。
NIO.2 API 涵盖三个主要增强领域:异步 I/O、经过更新的 SocketChannel 功能以及更强的文件系统接口。这些更新都将继续提供生成高度可伸缩 I/O 基础设施的功能。
AsynchronousChannel
,可允许线程继续工作,同时 I/O 也将继续,并在稍后通知 I/O 已经完成。版本 7 提供了两种通知机制:其一,异步 I/O 调用将返回一个 java.util.concurrent.Future
对象,它表示生成的对象,用于提供 API 以等待 I/O 完成或者轮询其当前状态;第二种机制是指定一个 java.nio.channels.CompletionHandler
,这将在 I/O 完成时在回调中调用。NetworkChannel
接口,其中定义了 bind()
、getLocalAddress()
、getOption()
和 setOption()
方法。此外,还通过新的 MulticastChannel
接口添加了多播支持。Concurrency 和 Collections 更新
Java 5 在 JSR 166 下引入了 java.util.concurrent
包,而 Java 6 又通过 JSR 166x 对其进行了进一步的扩展。然后,Java 7 通过 JSR 166y 对并发性再次进行了更新,提供了一个全新的 fork-join 框架,即 JSR 总监 Doug Lea 口中的 “多核友好轻量级并行框架”。其他增强还包括 TransferQueue
和 Phaser
。
TransferQueue
是一种 BlockingQueue
,但其不同之处在于提供了一个记录的交付服务。虽然将对象成功添加到队列中之后会返回一个将对象插入 BlockingQueue
的线程,但仅在另一个线程从队列中删除了对象之后才会返回负责将对象插入到 TransferQueue
中的线程。 Phaser
类提供了一个全新的同步阻止对象,它与 Java 5 中已经引入的 CyclicBarrier
相类似,但提供了一些额外的特性。特别是动态更改注册方数量的能力。 IBM 提供的增值特性
除了每个新的 Java 平台发行版要强制更新的特性之外(由于JVM 规范和 Java 类库 API 的更新),每个 Java 供应商都允许向其 Java 功能包交付自己的增值特性。对于 IBM 的 Java 功能包,这些增值增强通常主要针对三个领域:性能、可靠性和可服务性。
了解 IBM 的 Java SE 7 实现
Java 运行时的性能是影响部署应用程序的投资回报率的直接因素。鉴于此,各种标准基准测试可用于模拟特定的部署场景或工作负荷类型,以便能对投资回报率有大致的理解。虽然大多数基准测试都侧重于运行时性能 — 应用程序可以执行的速度 — 但 IBM 还对应用程序的初始启动时间深感兴趣。
启动性能
Java 应用程序的启动性能是 IBM 团队的一个主要关注点,不仅因为启动时间会潜在影响客户端应用程序的适用性,还会影响服务器端应用程序的再利用和故障转移场景的启动时间。
在 IBM SDK for Java 5 中,IBM 提供了一个主要特性,用于以类共享的形式减少 Java 应用程序启动和重新启动的时间。这种方法允许将所有系统和应用程序类存储在共享内存的持久动态类缓存中,并且处于已经过类数据验证的状态(很重要)。其结果是,当 Java 应用程序载入类时,大量操作会在启动时发生,而共享内存则没有验证字节码的开销。
在 IBM SDK for Java 6 中,IBM 针对启动性能继续在共享类缓存中添加了中度优化的 Just-in-time (JIT) 编译代码。这意味着可以消除启动过程的另一个主要开销:编译应用程序启动过程中涉及的常用方法。
IBM SDK for Java 7 将进一步改善启动性能,专注于在共享缓存中存储更多数据以及在多线程上执行单线程启动活动等领域。
运行时性能
Java 应用程序的性能始终是大多数供应商所专注的领域。同样,IBM 的 Java 运行时也有一个优先领域。每个 IBM 运行时发行版都力争对上一发行版的性能进行增强。
表 1 显示了 IBM SDK for Java 版本 5 和 6 之间的性能增强(在 AIX 上使用 IBM 32 位 Java 运行时):
IBM SDK for Java | 结果(bops/JVM) 4 核 |
结果(bops/JVM) 8 核 |
结果(bops/JVM) 16 核 |
---|---|---|---|
V5 | 87737 | 86686 | 86497 |
V6 | 102959 | 100731 | 99844 |
百分比增强 | 17.3% | 16.2% | 15.4% |
注意:数据来自发布在 spec.org 上的 SPEC JBB2005 基准测试数据,在 IBM System p 570, 4.7 GHz 上使用 IBM Java Runtime。
还是一样,对于 IBM SDK for Java 7 来说,运行时性能仍然十分重要。开放 beta 项目页面 将详细介绍最新的特性。
可靠性
Java 运行时的可靠性极为重要,这在 24x7 全天侯运行业务关键型应用程序时尤为突出。为了创建高度可靠的运行时,IBM 团队在开发过程中采用了大量质量流程,并使用代码库结构和测试战略来最大限度增加测试范围和场景。
所有平台的公共代码
自 IBM SDK for Java 5 发布以来,IBM Java 运行时实现的所有底层组件都建立在一个公共代码库的基础之上,它只有很少与平台或架构相关的代码。IBM 交付了 14 个 IBM SDK for Java 6 发行版,覆盖 31、32 和 64 位 Windows 和大型机上的 z/OS。广泛的硬件和操作系统配置可允许通过测试来确保大量场景的可靠性。通过扩展,查找和修复一个配置结果中的错误可以改善所有配置。这种广泛的测试场景将极大地改善发现时机和同步式错误的可能性。
产品组合
大多数 IBM Software Group 产品组合都使用 Java 代码。这意味着 IBM 不仅感兴趣于创建高质量、可靠的 Java 运行时,它还会对 IBM 软件产品线执行大量测试。应用于 Java 运行时的测试场景(包括测试开源产品)将结合测试这些 IBM 软件产品的大量典型部署和负荷场景。 这种测试广度和深度有助于确保 IBM Java 运行时的质量和可靠性。除了 IBM Software Group 产品组合之外,许多 ISV 合作伙伴还将测试针对 IBM 运行时的各种软件场景,进一步扩展用例覆盖面。
可服务性
与所有供应商相同,IBM 力争将应用程序部署做得完美无暇,但软件开发的一个被人接受的事实是难以避免容易造成意外结果的缺陷。为了理解问题的根源并加以解决,IBM 提供了监控和诊断功能及工具来帮助排除部署 Java 应用程序过程中或者 Java 运行时中的问题。
调试功能
jstracktrace
转储,它提供了调用代码栈跟踪以及一个 “睡眠” 选项,可用于在运行代码中插入任意延时。 OutOfMemoryError
等问题事件发生时,IBM Java 运行时会生成大量诊断文件,其中包含关于问题根源的有用信息。诊断收集器(Diagnostics Collector)工具会在诊断文件创建之后运行,搜索系统转储、Java 转储、堆转储、Java 跟踪转储和详细 GC 日志,获取问题的相关时间戳。然后,诊断收集器会生成一个经过压缩的 .zip 文件,其中包含问题事件的所有诊断,以降低所占用的磁盘容量,并消除手动搜索可能存在或不存在的文件的需求。 IBM 监控和诊断工具
verbose:gc
输出或操作系统内存监控数据的分析和视图,并以图形和表格的形式显示它们。它还提供了清晰的概要,并解释信息以生成一系列调优建议,以及检测 Java 内存泄漏。这种解释可允许您理解应用程序的内存使用配置文件,并通过调优改善垃圾收集器的性能。 结束语
Oracle 和 IBM 正在有条不紊地开发 Java 7 SDK。虽然发行版的规范和内容在不断发生变化,但本文中的信息应该能让您更好地理解当前的状况。您还可以通过 Early Access 项目(参见 参考资料)来持续跟踪开发进展,从而帮助您融入开发过程并获取关于重要特性及功能的反馈。
参考资料
学习
获得产品和技术
讨论
关于作者
Chris Bailey 于 2000 年作为 Southampton University 的毕业生加入 IBM Java Technology Centre。他是 IBM Java 服务和支持组织的一名技术架构师,负责帮助 IBM SDK for Java 用户提供成功的应用程序部署。Chris 的工作还包括收集和评估新兴需求,交付各种最新的调试功能和工具,完善文档以及改善 IBM SDK for Java 的质量。