简介
从 IBM i 7.1 开始,IBM Classic Java Virtual Machine 不再被 IBM i 支持了。IBM Technology for Java Virtual Machine(又名 IBM J9 JVM)成为了唯一被支持的 JVM。这篇文章旨在阐述这两种 JVM 的区别,同时帮助用户和开发人员把他们的应用程序从 Classic JVM 移植到 J9 JVM。在 IBM i 上,所有版本的 Java 开发包(JDK)都以 Java 许可程序的 option 的形式发布(例如:IBM i 7.1 上的 5761JV1 产品)。
尽管这篇文档很细致和全面的讨论了 Classic JVM 和 J9 JVM 的区别,这并不意味着从 Classic JVM 到 J9 JVM 的迁移是很困难的,或者需要对应用程序进行很大的修改。对于大多数用户来说,从 Classic JVM 到 J9 JVM 的改变是一个非常简单的过程。大多数情况下,只需要改变一下 JAVA_HOME,他们的应用程序就能工作。这篇文档的目的是给那些出现问题的用户,此文档可以帮助他们快速了解问题是什么,并且尽快将问题解决。
用户界面的区别
选择想要的 JDK 版本
过去,当使用 Classic JVM 时,系统属性"Java.version"被用来为 Java 应用程序设置特定版本的 JDK。例如,使用命令"Java -DJava.version=1.5 HelloWorld"后, Classic JVM 会用 JDK 1.5 运行 HelloWorld。
对于 J9 JVM,系统属性"java.version"不被支持。唯一设置 JDK 版本的方式,是设置环境变量 JAVA_HOME。例如,如果把 JAVA_HOME 设置成 "/QOpenSys/QIBM/ProdData/JavaVM/JDK50/32bit",我们可以让 J9 JVM 在 JDK 1.5 32bit 上运行。J9 为每个 JDK 提供了 32bit 和 64bit 两个版本。
CL 命令
与关联 Java 程序相关的命令
Direct execution(直接执行) 是一种从 Java 类文件,jar 文件或 zip 文件中创建 Java 程序的技术。当使用 Classic JVM 的时候,所有的 jar 文件或 class 文件都被要求附带一个 *JVAPGM 对象。 这个对象包含了 2 个主要部分:一个是预先验证过的字节码,另一个是 direct execution 产生的代码。
从 IBM i 6.1 开始,在 direct execution(DE)模式下运行 Java 程序的功能不再被支持了,direct execution 的代码不能再被运行,但是 Classic JVM 依然要求 *JVAPGM,因此我们依然可以受惠于这种预先验证的字节码。
在 IBM i 7.1,一些 Classic JVM 的命令依然可用。这些命令是: ANZJVAPGM、CRTJVAPGM、DSPJVAPGM、CHGJVAPGM 和 DLTJVAPGM。在 i 7.1 上,jar 和 class 文件可以有 *JVAPGM 对象,但是这些对象会被 JVM 完全忽略掉。在 i 7.2 上,任何 jar 或 class 文件只要有 *JVAPGM 对象,这个 *JVAPGM 对象都会被删除。
JVM 作业管理和分析的命令
在 IBM i 上,有一些命令用来帮助管理 JVM 作业和调试问题。有的命令适用于 Classic JVM,有的适用于 J9 JVM,有的两个都适用。下面是这些命令的列表:
ANZJVM: 只适用于 Classic JVM。
DSPJVMJOB: 对 Classic 和 J9 JVM 都适用。
DMPJVM: 只适用于 Classic JVM。
GENJVMDMP: 从 i 6.1 开始存在,只适用于 J9 JVM。
PRTJVMJOB: 从 i 6.1 开始存在,只适用于 J9 JVM。
WRKJVMJOB: 从 i 6.1 开始存在,只适用于 J9 JVM。
JAVA 和 RUNJVA
JAVA 命令和 RUNJAVA 命令的 GCHMAX 选项的取值 *NOMAX 只适用于 Classic JVM。J9 JVMs 不支持 *NOMAX 值,而是用 -Xmx 设定的值作为最大的堆大小。如果不设置 -Xmx,J9 JVM 使用 2G 作为默认值。
"Java Hello"和"Java QIBMHello"
Classic JVM 提供了一个"Hello"类文件在它类路径的根目录下,而 J9 JVM 提供了 QIBMHello.
System Properties
在 IBM i 的以前版本中,Classic JVM 支持一些特定的系统属性,这些属性在 J9JDK 中不再被支持。使用这些系统属性的用户需要找到在 J9 JVM 中相应的系统属性 ( 或者方法 ) 来实现他们的需求。表 1 是这些不再被 J9 支持的属性列表: