从 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。想要获得更多信息,请参阅 IBM i 6.1 信息中心的 920.html">Release-to-release compatibility部分。在 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 支持的属性列表:
表 1. J9 不再支持的系统属性
系统属性 含义 os400.
define.class.cache.file 控制用户类装载器的缓冲。这个属性值指定一个有效的 Java 压缩文件(全路径) os400.define.class.cache.hours 控制用户类装载器的缓冲。这个属性值指定 Java 程序对象在缓冲中的时间(小时) os400.define.class.cache.maxpgms 控制用户类转载器的缓冲。这个属性值指定可以缓冲的最大 Java 程序对象数。 os400.jit.mmi.threshold 设置一个方法可以在混合模式解释器(MMI)中运行的次数,之后 JVM 将使用 JIT 将这个方法编译成机器指令。 os400.class.path.security.check 确定有公共写权限的类目录中目录的出错消息级别 os400.class.path.tools 标记是否将 tools.jar 加入到启动类目录中 os400.interpret 用于向 CL 命令 JAVA 给出参数 os400.optimization 给出 Java 程序的优化级别 os400.enbpfrcol 通知 JIT 产生调用记录以及 PDC 的进入和退出钩子,并加入到方法中。在 J9 中,这是使用 JVMTI 实现的。 os400.gc.heap.size.max 设置最大 GC 堆大小 os400.gc.heap.size.init 设置初始化 GC 堆大小 os400.pool.size 在线程本地堆中,定义每一个堆池中可用的空间大小(K) Java.version 使用这个属性来决定哪个版本的 JVM 将被使用。