一般移植注意事项
在将 Java™ 应用程序移植到 64 位系统之前,您将需要考虑许多问题。
64 位处理器上的 Java 平台
- 在 31 位系统上,最大 Java 堆空间 (在运行时存放 Java 对象) 为 2GB ,而 64 位系统的堆空间最多可达 (且超过) 32GB。 这种更大的堆空间对于 Java 应用程序能够使用大型,功能强大的系统的全部功能至关重要。
- 某些 Java 应用程序通过 Java 本机接口 (JNI) 使用本机代码,其中本机代码是 64 位。 例如, Java 数据库连接 (JDBC) 驱动程序在 64 位平台上以 64 位本机代码编写。
- 某些 Java 应用程序需要 64 位系统的其他改进功能。
Java API 和移植本机代码

上图有助于识别重要组件以及了解将应用程序从 31 位 移植到 64 位时需要更改的内容。 所有 Java 应用程序都将写入定义的 Java 应用程序编程接口 (API)。 对于 Java 平台的 31 位 和 64 位版本,此 API 相同。
Java API 包含 Java 类库 (例如, net, lang, io和 rmi) ,它们是 Java 平台的基本部分。 Java API 和所有 Java 代码在 64 位实现上与在 31 位 实现上完全相同。 因此,如果您具有在 31 位 Java 系统上运行的 Java 应用程序代码,那么它将在 64 位系统上按原样运行。
许多 Java 应用程序不是用 Java 语言 100% 编写的。 对于这些应用程序,它们的一些代码是用非 Java 语言编写的,例如 C 或 C++ ,它通常被称为 "本机代码"。 移植具有本机代码的 Java 应用程序需要更多工作。
所有Java代码(应用程序和类库)均由Java虚拟机(Java VM )执行。 Java VM 包含子组件,这些子组件负责运行 Java 代码并管理 Java 堆中的数据。 J9 ( VM )包含一个即时编译器(JIT),该编译器会在执行前将Java代码编译为本机处理器指令。 此编译过程可最大程度提高代码性能。
在64位Java环境的实现中,Java虚拟机( VM )作为64位程序运行,并能识别底层处理器的64位特性。 这包括 JIT 编译器,它必须编译 Java 代码才能使用 64 位地址。 JIT 编译器也了解底层处理器上可用的完整 64 位指令集。
Java VM 通过主机端口接口(HPI)与操作系统进行通信。 此通信机制使Java的 VM 代码独立于底层操作系统,并允许Java平台的 IBM® 实现支持特定处理器类型上的多种操作系统。
JNI 和本机代码
Java VM、HPI 层以及 Java 代码均在单个 64 位操作系统进程中执行。 通常,有部分本机代码在同一个进程中执行。 本机代码是直接针对处理器和操作系统编译的一个或多个代码库。 通过 Java 本机接口 (JNI) 从 Java 代码访问本机代码。 本机代码还可以通过 JNI 访问 Java 对象和方法。 部分原生代码是实现 J2SE 的一部分,例如实现操作系统提供的Java rmi 使用远程过程调用的类 函数的代码。 其他本机代码可作为应用程序的一部分提供。
还有一个与 JNI 类似的接口 :Java 虚拟机工具接口 (JVMTI)。 此接口提供用于对 Java 应用程序进行概要分析和调试的功能。 要使用这些功能,必须编写一些本机代码。
在Java平台的64位实现中,所有与64位Java运行时环境( VM )关联的本机代码必须为64位,因为这些代码均在与Java运行时环境( VM )相同的进程空间中运行。 无法在同一进程空间中运行 64 位代码和 31 位 代码,因为这两种类型的代码之间的地址大小不兼容。
通常以 C 或 C++ 语言编写的本机代码可直接知晓地址大小。 如果应用程序包含本机代码,那么必须修改这些本机代码,以便正确处理 64 位环境中的差异(例如,64 位地址)。 最后,还必须针对 64 位系统重新编译和重新链接本机代码。
简而言之,64位Java的 VM 实现运行于64位处理器上,并链接至同样具备64位"感知能力"的代码。 Java VM 还能够利用底层处理器的大内存支持和64位指令集。 它运行的 Java 应用程序与可以在 Java 的 31 位 实现上运行的应用程序完全相同。 只有本机代码才能从 31 位 系统移植到 64 位系统。
从 31 位 移动到 64 位时 Java 程序的优势
Java 语言和环境使从 31 位 计算直接过渡到 64 位计算。 对于使用其他具有显式地址指针的语言 (例如 C 和 C++) 编写的程序,将应用程序从 31 位 移植到 64 位可能需要相当大的工作量。 这是因为每个指针都必须重新声明为一个 64 位数量,并且必须仔细检查与地址有关的任何计算并作出适当调整以确保它可在 64 位环境中正常执行。 相比之下,100% Java应用程序甚至无需重新编译即可在64位环境中正常运行。 对于Java应用程序而言,所有繁重的工作都由Java的 VM 实现完成,而底层的指针大小则被隐藏起来。