Java 技术,IBM 风格: Java 技术的新纪元 (JAVA7新特性)

Java 技术,IBM 风格: Java 技术的新纪元

Oracle 规范要点以及 IBM 的性能、可靠性和服务性增值服务

Chris Bailey, Java 支持架构师, 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 语言支持
  • “易于开发” 更新
  • 模块化支持
  • 可伸缩性更新

非 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
    在 Java 7 之前的发行版中,您无法在 switch 语句中使用 StringObject。这意味着对 String 执行 switch 式语句的唯一方法是使用一系列 if-then-else 语句或者将 String 转换为原始类型或 enum 类型。Stringswitch 语句中的使用意味着以下简单结构现在已经合法:

    switch (myString) {
                   case "one": <do something>; break;
                   case "red": <do something else>; break;
                   Default: <do something generic>;
    }
  • 改善泛型实例创建的类型推断
    Java 5 引入了泛型,这使它能够对实例化过程中对一般集合类应用参数化类型,从而实现编译时安全检查。但是,在实现中,类型参数会有不必要的重复,例如:

    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
    }

闭包争论

闭包在 Java 社区引起了相当大的争议。纳入还是弃用?现在,最佳选择是什么?早在 2007 年,Brian Goetz 就对 当时的闭包进行了一番讨论,而这随着时间的流逝已经逐渐退去。Neal Gafter 始终拥护将闭包添加到 Java 语言中。他的 Java 闭包 页面提供了关于这一主题的大量信息。

闭包(非 Coin)

包括 Scheme、Ruby 和 SmallTalk 在内的许多编程语言都允许使用闭包或 lambda 函数。闭包实现有望添加在最终 Java 7 规范中;但是,详细实现尚不明确,因为有多个有竞争力的提议。

模块性支持

在每个新版本的 Java 平台中,SDK 的体积都有所增长 — 这一副作用是由各种环境中可用功能增加造成的。虽然许多功能都是资源,但过大的体积和复杂性会不可避免地影响一些关键性能指标:下载大小、启动时间和内存占用。

Project Jigsaw

访问 developerWorks roundtable,了解 Project Jigsaw 以及它在 Java 模块性解决方案中的位置。其中包含关于 Java 技术、文化和行业的最新信息。

为了解决这些问题,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 基础设施的功能。

  • 异步 I/O
    Java 平台版本 7 为套接字和文件引入了异步 I/O:它提供了一组全新的 AsynchronousChannel,可允许线程继续工作,同时 I/O 也将继续,并在稍后通知 I/O 已经完成。版本 7 提供了两种通知机制:其一,异步 I/O 调用将返回一个 java.util.concurrent.Future 对象,它表示生成的对象,用于提供 API 以等待 I/O 完成或者轮询其当前状态;第二种机制是指定一个 java.nio.channels.CompletionHandler,这将在 I/O 完成时在回调中调用。
  • 经过更新的 SocketChannel API
    在 NIO.2 更新 SocketChannel API 之前,网络渠道实现并不是网络套接字的完整抽象:您需要使用套接字和渠道 API 来创建网络渠道。更新解决了此问题,每个面向网络的渠道都将实现一个新的 NetworkChannel 接口,其中定义了 bind()getLocalAddress()getOption()setOption() 方法。此外,还通过新的 MulticastChannel 接口添加了多播支持。
  • 经过改善的文件系统 API
    经过改善的文件系统 API 修复了标准 Java File I/O API 中的一些基本问题(如在文件删除或重命名时缺少 I/O 异常),并为需要在所提供的 API 之上使用自定义代码执行的常见任务提供了新的支持。这包括对复制和移动文件、符号、链接和文件权限的支持,并提供了一个文件变更通知和监控 API。

Concurrency 和 Collections 更新

Java 5 在 JSR 166 下引入了 java.util.concurrent 包,而 Java 6 又通过 JSR 166x 对其进行了进一步的扩展。然后,Java 7 通过 JSR 166y 对并发性再次进行了更新,提供了一个全新的 fork-join 框架,即 JSR 总监 Doug Lea 口中的 “多核友好轻量级并行框架”。其他增强还包括 TransferQueuePhaser

坚持 fork

Java 7 期待已久的有力证据就是,Brian Goetz 撰写的这一流行的关于 fork-join 框架的两部分系列文章几乎是在两年前发表的。第 1 部分 介绍分解众多算法以便有效利用硬件并发性的机制,第 2 部分 则详细讨论 ParallelArray 类,该类可简化针对驻内存数据结构的并发排序和搜索操作。

  • Fork-join 框架
    fork-join 框架的目标是为可分解为多个并行任务的高性能计算任务提供支持,从而允许有效利用多个处理器及内核。

    典型示例演示,合并排序算法可以分解为多个并发任务。待排序数据将分解为可作为子任务独立排序的分段,同时子任务又有可能再度分解为更加小的子任务。子任务完成之后,整合结果(合并)。流程的原理是将特定任务分解为众多子任务,然后等待合并完成的任务。Java 7 中添加的 fork-join 框架提供了实现 fork-join 处理的基础设施,包括池处理和工作窃取,以降低等待其他子任务完成带来的影响。
  • TransferQueue
    TransferQueue 是一种 BlockingQueue,但其不同之处在于提供了一个记录的交付服务。虽然将对象成功添加到队列中之后会返回一个将对象插入 BlockingQueue 的线程,但仅在另一个线程从队列中删除了对象之后才会返回负责将对象插入到 TransferQueue 中的线程。
  • Phaser
    Phaser 类提供了一个全新的同步阻止对象,它与 Java 5 中已经引入的 CyclicBarrier 相类似,但提供了一些额外的特性。特别是动态更改注册方数量的能力。

IBM 提供的增值特性

除了每个新的 Java 平台发行版要强制更新的特性之外(由于JVM 规范和 Java 类库 API 的更新),每个 Java 供应商都允许向其 Java 功能包交付自己的增值特性。对于 IBM 的 Java 功能包,这些增值增强通常主要针对三个领域:性能、可靠性和可服务性。

了解 IBM 的 Java SE 7 实现

Java 运行时的性能是影响部署应用程序的投资回报率的直接因素。鉴于此,各种标准基准测试可用于模拟特定的部署场景或工作负荷类型,以便能对投资回报率有大致的理解。虽然大多数基准测试都侧重于运行时性能 — 应用程序可以执行的速度 — 但 IBM 还对应用程序的初始启动时间深感兴趣。

详细了解 IBM 在 Java SE 7 中的参与

IBM 的 Java SE 7 首席架构师 Trent Gray-Donald 在此 播客 中提供了他对 Oracle Java 7 规范、IBM 增值功能以及 Java 技术发展水平的见解。

启动性能
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 运行时):


表 1. IBM SDK for 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 SDK for Java 7

开放 beta 项目 提供了对最新 IBM SDK for Java 7 beta 的许可访问。它提供了新技术和特性的预览版本,并允许您通过开放 beta 项目讨论提供反馈。

产品组合
大多数 IBM Software Group 产品组合都使用 Java 代码。这意味着 IBM 不仅感兴趣于创建高质量、可靠的 Java 运行时,它还会对 IBM 软件产品线执行大量测试。应用于 Java 运行时的测试场景(包括测试开源产品)将结合测试这些 IBM 软件产品的大量典型部署和负荷场景。 这种测试广度和深度有助于确保 IBM Java 运行时的质量和可靠性。除了 IBM Software Group 产品组合之外,许多 ISV 合作伙伴还将测试针对 IBM 运行时的各种软件场景,进一步扩展用例覆盖面。

可服务性

与所有供应商相同,IBM 力争将应用程序部署做得完美无暇,但软件开发的一个被人接受的事实是难以避免容易造成意外结果的缺陷。为了理解问题的根源并加以解决,IBM 提供了监控和诊断功能及工具来帮助排除部署 Java 应用程序过程中或者 Java 运行时中的问题。

调试功能

  • 转储引擎增强
    转储引擎支持生成各种不同类型的数据,从非破坏性系统转储到线程转储,甚至还可以选择执行特定命令行,以及在更广的事件条件下执行此操作。

    借助 IBM SDK for Java 7,您现在可以生成新的转储类型,包括 “栈” 类型,它可以为导致事件的线程生成一个单一的栈跟踪,并适用更多事件的情况,包括分配对象时发生的 “分配” 事件。
  • 跟踪引擎增强
    跟踪引擎可通过无检测的方式来跟踪 Java 运行时的内部以及在其上运行的 Java 代码内部的状况,包括核心类库、中间件代码或者您自己的代码。除了执行引擎跟踪代码之外,还可允许触发事件。从最基本的层面来说,您可以使用开关来开启或关闭跟踪,以便减少生成的跟踪数据量并生成转储,包括新的 jstracktrace 转储,它提供了调用代码栈跟踪以及一个 “睡眠” 选项,可用于在运行代码中插入任意延时。
  • Java 转储增强
    javadump 文件包含执行运行时的状态概要,包括对应用程序中所有线程的栈跟踪。该文件也得到了增强。变更采用操作系统非限制(ulimits)和环境变量的形式,以及各线程的本机(C)栈跟踪,以便更好地洞察 Java 运行时代表 Java 代码的行为,或者任何 Java Native Interface (JNI) 代码中发生的事件。
  • 诊断收集器
    当一般保护故障或 OutOfMemoryError 等问题事件发生时,IBM Java 运行时会生成大量诊断文件,其中包含关于问题根源的有用信息。诊断收集器(Diagnostics Collector)工具会在诊断文件创建之后运行,搜索系统转储、Java 转储、堆转储、Java 跟踪转储和详细 GC 日志,获取问题的相关时间戳。然后,诊断收集器会生成一个经过压缩的 .zip 文件,其中包含问题事件的所有诊断,以降低所占用的磁盘容量,并消除手动搜索可能存在或不存在的文件的需求。

IBM 监控和诊断工具

  • 垃圾收集和内存可视化器(GCMV)
    GCMV 提供应用程序 verbose:gc 输出或操作系统内存监控数据的分析和视图,并以图形和表格的形式显示它们。它还提供了清晰的概要,并解释信息以生成一系列调优建议,以及检测 Java 内存泄漏。这种解释可允许您理解应用程序的内存使用配置文件,并通过调优改善垃圾收集器的性能。
  • 转储分析器
    转储分析器(Dump Analyzer)工具可帮助您使用操作系统级转储确定 Java 应用程序故障的根源。它提供一些独立的分析器,可生成解答特定问题的特定数据。这些分析器结合在一起,共同生成关于任何问题根源及应用程序状态的报表。
  • 健康中心
    健康中心(Health Center)是一个低开销实时监控解决方案,可允许您获取运行中 Java 应用程序的当前状态。健康中心以通俗易懂的方式提供关于性能、内存使用、管理、优化和分析的信息。特别要指出的是,健康中心提供了方法分析信息,可反映方法的调用频率以及调用栈跟踪,并提供关于应用程序中同步代码的信息,以及关于 Java 堆和总体流程的内存使用的数据。
  • 内存分析器
    通过使用 Diagnostic Tool Framework for Java (DTFJ) 扩展 Eclipse MAT,内存分析器(Memory Analyzer)将 Eclipse Memory Analyzer Tool (MAT) 的诊断功能引入了到 IBM Java 运行时中。此扩展允许 Java 堆分析使用操作系统级转储和 IBM Portable Heap Dumps (PHD),这样您便可以诊断内存泄漏的根源,分析应用程序的内存占用,查看 Java Collections 的大小和效率,以及理解应用程序在特定时间的状态。

结束语

Oracle 和 IBM 正在有条不紊地开发 Java 7 SDK。虽然发行版的规范和内容在不断发生变化,但本文中的信息应该能让您更好地理解当前的状况。您还可以通过 Early Access 项目(参见 参考资料)来持续跟踪开发进展,从而帮助您融入开发过程并获取关于重要特性及功能的反馈。


参考资料

学习

  • IBM 的 Java SE 7 首席架构师讲话:在此播客中,Trent Gray-Donald 谈论了 Java SE 7 规范,IBM 对于增强平台的想法,以及他对当今 Java 技术的见解。
  • Pure Danger Tech: Java 7:Alex Miller 列出了 Java 7 的提议特性以及相关信息。
  • IBM SDK for Java 7 开放 beta 项目:获取最新 IBM SDK for Java 7 beta 的许可。了解新技术和特性,并通过 开放 beta 项目论坛 提供反馈。
  • OpenJDK 7:Java SE 平台下一个主要修订版的开源实现,由 GPL2 许可。
  • Apache Harmony:Java SE 平台的另一个开源实现,由 Apache 许可。
  • Java roundtable, Spring 2010”:了解 Java 平台未来的实际情况,因为 9 个 Java 社区领袖都明确指出 Java 行业如今面临艰巨问题。
  • IBM 的 Java 诊断 (developerWorks,2007-2009):探索 IBM 的新工具,了解如何解决 Java 应用程序问题,并改善他们的性能。文章中的全新信息可以帮助您立即应用于实践。
  • 浏览 技术书店,获取关于各种技术主题的书籍。
  • developerWorks Java 技术专区:数百篇关于 Java 编程方方面面的文章。

获得产品和技术

  • Oracle 提供的 Java Early Access 下载:从 Oracle 下载 JDK 7 的最新预览版本。

    IBM SDK, Java Technology Edition, Version 7 Early Access Release:试用最新版本的发行版。
  • IBM 监控和诊断工具:这些工具和文档将帮助您监控、诊断运行 IBM Runtime Environments for Java 的应用程序及部署问题

讨论

  • IBM SDK for Java 7 开放 beta 论坛:帮助塑造 IBM SDK for Java 7 的方向。
  • IBM Java 运行时和 SDK 讨论论坛:IBM Java 服务及支持组织的技术架构师 Chris Bailey 以及 IBM JTC 团队的其他成员邀请您加入此讨论论坛,分享关于使用各种 IBM 运行时和工具包的经验,以及提出相关疑问。

关于作者

Chris Bailey 于 2000 年作为 Southampton University 的毕业生加入 IBM Java Technology Centre。他是 IBM Java 服务和支持组织的一名技术架构师,负责帮助 IBM SDK for Java 用户提供成功的应用程序部署。Chris 的工作还包括收集和评估新兴需求,交付各种最新的调试功能和工具,完善文档以及改善 IBM SDK for Java 的质量。

0
0

你可能感兴趣的:(java,oracle,IBM,Collections,语言,java7)