2010 年 4 月,IBM i 新的版本 V7R1 发布,在这一新的版本中,IBM i 对 Java 的支持做出了重要的调整。与以往版本中(V5R4,V6R1)同时支持 Classic 和 J9 两种 JVM 不同,从 V7R1 开始,IBM i 将只支持 J9 JVM。本文是对 J9 JVM 的介绍,并对 Classic JVM 和 J9 JVM 进行对比,给出为什么 IBM i V7R1 会做出上述改变以及 J9 JVM 将会给 IBM 带来什么。

闻林涛, 软件工程师, IBM

闻林涛来自 IBM 中国系统与科技研发中心 IBM i J9 团队,具有多年的 Java 从业经验,目前主要负责 IBM i 上 J9 VM 及 Classic JVM 的测试工作。



2011 年 8 月 24 日

使用 IBM i 与 J9 VM

Java 在 IT 业界有多流行?在 Google 上搜索一下 Java,结果一目了然(今天早上笔者搜索到的记录数是 840,000,000 条)。Java 之所以能广泛的被应用,与它“一次编译,处处运行”,也就是跨平台性密不可分。Java 虚拟机(Java Virtual Machine,JVM)是 Java 的跨平台性实现的基础,不同平台上标准统一的 JVM 提供了相同虚拟运行环境,使得 Java 应用不用做或做很小的修改就能在各个平台上运行。IBM Technology for Java Virtual Machine(J9 VM)是 IBM 自己开发的一款 JVM,它支持在当前流行的大部分平台上的安装和使用,这其中就包括 IBM i。本文将对这款虚拟机以及它在 IBM i 上的支持进行简单的介绍。

子曰:名不正则言不顺。虽然孔圣人的这个“名”不是名字的名,这里还是要借用一下,先让我们把要介绍的这个 JVM 的名字说清楚。除去 IBM Technology for Java Virtual Machine,在一些文档中,也许你还读到过这些名称:IBM Virtual Machine for Java,IBM JVM,IBM J9 VM,J9 JVM 以及 IT4J。其实这些名称指的都是本文要介绍的这款 JVM(为了方便,本文中统一使用J9 VM),而这些不同的名称中,J9 显得更特别一点。为什么会有 J9 这个名字呢?这与这款 JVM 的出身有关,它最早是由 IBM Ottawa 实验室一个 SmallTalk 的虚拟机扩展来的。那时候,这个虚拟机有一个 bug 是因为 8K 值定义错误引起,工程师们花了很长时间终于发现并解决了这个错误,此后这个版本的虚拟机就被称为 K8 了。于是,后来出现的支持 Java 这个版本的虚拟机就被称为 J9 了。

为实现 JVM 定义的功能(JVM 的功能和定义,请参考相关资料),并提供自己的独特性,J9 VM 主要由以下几部分组成,如图 1 所示。

图 1. J9 VM 的组成
J9 VM 的组成

说明:

  • JVM API:外部应用与 JVM 交互和调用的接口;
  • GC: 又被称为 Memory Management,是 JVM 内存管理模块;
  • Class Loader:支持 Java 语言动态装载代码的模块;
  • Interpreter:JVM 的解释执行器;
  • Diagnostics:提供 JVM 的可靠性(Reliability),可用性(Availability)和可服务性(Serviceability)特性;
  • Platform port layer:这个模块提供平台支持,使得 JVM 在各种不同系统平台上的运行。

良好的设计让 J9 VM 具有高可配置性和可扩展性,IBM 把它用在各种平台各个版本的 JDK 中,IBM i 只是 IBM 这些平台中的一个。其实,在 J9 VM 引入前, IBM i 就早已开始支持 Java。早在 1998 年,IBM i V4R2 就提供了 i平 台自己的 JVM,这款 JVM 就是 Classic JVM,通过它 Java 程序能够在 IBM i 上直接运行(在这之前,一款称为 Java Toolbox 的产品,已经支持运行在其他平台上的 Java 应用访问 IBM i 系统的资源,如数据文件,可运行程序等)。从 V5R4 开始 IBM i 引入 J9 VM。与 Classic JVM 只支持 64 位地址访问不同,J9 VM 有两种不同版本:32 位和 64 位。其中,IBM i V5R4 只支持 32 位版本 J9 JDK(JDK5.0 和 JDK6.0),V6R1 增加了 64 位版本的 JDK5.0,JDK6.0 和 JDK1.4。


J9 VM 与 Classic JVM 的不同

除 32 位与 64 位版本的区别外,J9 VM 与 Classic JVM 相比还有一些方面的不同,例如:

  1. JVM 实现和运行环境不同

    与 Classic JVM 不同,IBM J9 VM 是运行在 IBM i Portable Application Solutions Environment(PASE)中的一个应用。而 Classic JVM 是运行在 IBM i Technology Independent Machine Interface(TIMI)层之下,SLIC 层的产品。

  2. IBM i 工具支持的不同:

    IBM i 提供了一些运行和分析 Java 应用及任务的命令行命令。这些命令有些只支持 Classic JVM,有些只支持 J9 VM。例如,只支持 Classic JVM 的有:ANZJVM,DMPJVM;只支持 J9 VM 的有:GENJVMDM,PRTJVMJOB,和 WRKJVMJOB。

  3. JVM 上开发和运行 Java 应用的不同:

    • 对环境变量(Environment Variable)的支持不同。如对于 file.encoding,Classic JVM 选择与当前运行 job 的 CCSID 一致,而 J9 VM 则是通过环境变量 PASE_LANG 和 QIBM_PASE_CCSID 的值来确定。
    • 系统属性(System Property)的支持不同。例如对一些 Classic JVM 支持的系统属性(如 os400.define.class.cache.file),J9 VM 不再支持。
    • IBM i 相关特性的支持不同。这方面的区别包括,J9 VM 不再支持“Adopted Authority”,J9 VM 需要本地方法必须编译为 TERASPACE ENABLED 等。
    • 其他关于开发和运行 Java 应用差异的详细内容请参考”IBM JVM in IBM i5/os 红皮书”。
  4. 性能方面的不同。经 IBM 测试,J9 VM 在性能上平均比 Classic JVM 提高了 7%-10%。

虽然 Classic JVM 与 J9 VM 存在上述的一些不同,对客户的影响并不大,运行在 Classic JVM 的 Java 应用仍然很容易移植到 J9 VM 上,因为这两种 JVM 都符合 Java 规范的要求。对未受 JVM 运行环境不同影响的 Java 应用,可以不做修改直接运行在 J9 VM 上。对受到影响的,也可以按照 IBM 提供的方案修改后运行在 J9 VM 上(“IBM JVM in IBM i5/os 红皮书”中有关于如何修改应用程序的详细信息)。因为两种 JVM 都能够支持 Java 应用的良好运行,IBM i 经过 V5R4 和 V6R1 两个版本的过渡后,逐渐取消了对 Classic JVM 的支持(从 IBM i V7R1 开始,Classic JVM 已经不再支持)。为什么最终要用 J9 VM 取代 Classic JVM 呢?考虑起来,最主要有以下两个因素:

  1. J9 VM 在性能上更优于 Classic JVM。上文总结两种 JVM 的不同时,已经提到 J9 VM 性能的改善。特别需要提到的是 J9 VM 提供的 32 位的版本 JVM,它更加适用于中小型应用。有研究表明对于中小型应用,32 位 JVM 在堆占用上比 64 位少近 40%,性能最高有 20% 的提高。这于 IBM i 面向中小企业的市场定位更为相合;
  2. J9 VM 是 IBM 多个平台共用的,IBM 集中了最好的研究和开发团队,使得 J9 VM 缺陷的修改和新技术的应用更加及时和高效。此外多平台共用,也表明 J9 VM 的通用性更好。而 Classic JVM 作为 IBM i 独有的 JVM 需要单独的投入才能保证及时的更新。

总结

至此,我们初步介绍了 J9 VM,比较了它与 Classic JVM 的差异,也总结了为什么 IBM i 要以 J9 VM 来取代 Classic JVM。最后,再简单介绍一下 IBM i 上如何使用 J9 VM 运行 Java 应用。J9VM 是运行在 IBM i PASE 中的一个应用,而 IBM i 的 PASE 提供的是类似 AIX 的运行环境,这使得 J9 VM 在IBM i QSHELL 环境下的使用与 AIX 中非常相近。下面的示例就是一个简单的使用 J9 VM 的过程。

  1. 通过 QSH 命令进入 shell 环境;
  2. 通过环境变量 JAVA_HOME 来设置要使用的 JDK 版本,假设我们使用 JDK60 32bit:export JAVA_HOME=/QOpenSys/QIBM/ProdData/JavaVM/jdk60/32bit,需要注意大小写,/QOpenSys 下大小写敏感;
  3. 随 JDK 发布会有一个 QIBMHello 类,执行这个类会在控制台输出 QIBMHello 几个字符;通过执行它就可以验证 JDK 是否安装正确,运行命令:java QIBMHello

关于 J9 VM 在 IBM i QSHELL 中使用和支持的详细资料,以及 IBM i ILE 环境中的支持,请参考 IBM i 信息中心。

参考资料

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=IBM i, Java technology
ArticleID=751309
ArticleTitle=IBM i 与 J9 VM
publish-date=08242011