从Classic JVM迁移到J9 JVM的参考依据和技术指导

从 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 将被使用。

时间: 2024-10-23 10:52:32

从Classic JVM迁移到J9 JVM的参考依据和技术指导的相关文章

如何从 Classic JVM 迁移到 IBM J9 JVM

简介 从 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 开源J9 JVM

在今年的 JavaOne 上,IBM J9 JVM 团队负责人 Dan Heidinga 分享了主题为< J9: Under the Hood of the Next Open Source JVM>的演讲,其中有提到 IBM 计划提供开源版本的 J9--OpenJ9.具体开源时间没有公布,不过有表示会尽量和 Java 9 同期. https://yqfile.alicdn.com/94b347c1fa7b866e874867d660447045d39f7466.png" >

jvm-用Java写的JVM,在没有JVM的机器上怎么运行。

问题描述 用Java写的JVM,在没有JVM的机器上怎么运行. 我们知道,通常来说,一种语言的编译器和连接器的编写是无关乎这种语言本身的,因为最终只要这种编译器或连接器是以机器能读懂得二进制的形式存在的就行,机器便能运行它. 同样,我们也知道用Java编写的程序不是直接和硬件打交道,甚至不是和操作系统打交道,而是和JVM打交道,只有在装有JVM的机器上才能运行.那么此刻问题来了,本身是用Java写的JVM,他们是如何在没有JVM的机器上运行的呢?这就形成了一个悖论了.本人初涉Java,还望告诉能

一步步优化JVM二:JVM部署模型和JVM Runtime

选择JVM部署模型    JVM部署模型的选择总体来说就是决定应用是部署在单个JVM实例还是多个JVM实例上(这里简单举例说明一下JVM实例,比如:我们常用eclipse开发,启动一个eclipse就是启动了一个JVM实例,然后在JVM中运行一个main程序,又会启动一个JVM实例,两个JVM实例是隔离开的).哪一个是最适合你的应用的呢?这个是前面说到系统需求和潜在规则来决定的.比如说:假如你要部署您的应用在一个64位的机器上面,可以支持更大Java堆,如果应用依赖第三方的本地代码组件,而且这个

理解JVM(2)- JVM体系结构

前一篇我们简单了解了JVM是什么,现在我们将从整体上认识一下JVM由哪些部分组成 我们看一下JVM的架构: JVM字节码文件(JVM Languages Classes ) 包括但不仅限于Java语言编译而成的Class文件.实际上,Java虚拟机不和包括Java在内的任何编程语言绑定,它只与"Class文件"这种特定的二进制文件格式关联,只要特定语言的编译器能将代码编译成Class文件,虚拟机并不关心Class的来源是何种语言,如下图所示 类加载器(Class Loader) Cla

JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代

如果大家想深入的了解JVM,可以读读周志明<深入理解Java虚拟机:JVM高级特性与最佳实践>      需要掌握的东西,包括以下内容.判断对象存活还是死亡的算法(引用计数算法.可达性分析算法).常见的垃圾收集算法(复制算法.分代收集算法等以及这些算法适用于什么代)以及常见的垃圾收集器的特点(这些收集器适用于什么年代的内存收集).            JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示.      JVM内存结构由程序计数器.堆.栈.本地

介绍IBM i上J9 JVM崩溃的常见原因

IBM Technology for Java(IT4J,又名 J9) 是 IBM 自己开发的 Java 虚拟机,被发布在 IBM 的各个操作系统上.IBM i 从 5.4 版本中开始引入 J9,从 6.1 开始,系统默认的 Java 虚拟机 是 J9,从 7.1 开始,C++lassic JVM 不再被支持,J9 是 IBM i 上唯一的支持的 Java 虚拟机. 在 IBM i 上 ,PASE(Portable Application Solution Environment) 提供了一个仿

理解JVM(1)- JVM是什么

日常Java开发过程中,我们经常会提及JVM,那么它究竟是什么呢? 它是什么? JVM全称Java Virtual Machine(Java虚拟机),是一个虚构出来的计算机,它屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码,ByteCode), 就可以在多种平台上不加修改地运行.这背后其实就是JVM把字节码翻译成具体平台上的机器指令,从而实现"一次编写,到处运行(Write Once, Run Anywhere)". 它在哪里? %

Java虚拟机详解01----初识JVM

主要内容如下: JVM的概念 JVM发展历史 JVM种类 Java语言规范 JVM规范 一.JVM的概念: JVM: Java Virtual Machine,意为Java虚拟机. 虚拟机: 指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统 有哪些虚拟机: VMWare.Virtual Box:都是使用软件模拟物理CPU的指令集 JVM:使用软件模拟Java 字节码的指令集   二.JVM发展历史: 1.Java发展史: 1996年:SUN JDK 1.0 Cla