针对 32 位 JDK 构建和编译成 32 位字节代码的 Java 代码是否可以在 64 位 JVM 中工作?还是 64 位 JVM 需要 64 位字节码?
为了提供更多细节,我的代码在运行 32 位 JVM 的 Solaris 环境中工作,但现在我在将 JDK 和 Weblogic Server 升级到 64 位后遇到了问题。
针对 32 位 JDK 构建和编译成 32 位字节代码的 Java 代码是否可以在 64 位 JVM 中工作?还是 64 位 JVM 需要 64 位字节码?
为了提供更多细节,我的代码在运行 32 位 JVM 的 Solaris 环境中工作,但现在我在将 JDK 和 Weblogic Server 升级到 64 位后遇到了问题。
是的,假设您使用独立于平台的库,Java 字节码(和源代码)是独立于平台的。32 位与 64 位无关紧要。
我不小心在 64 位 VM 而不是 32 位 VM 上运行了我们的(大型)应用程序,直到一些外部库(由 JNI 调用)开始失败时才注意到。
在 32 位平台上序列化的数据在 64 位平台上被读取,完全没有问题。
你遇到什么样的问题?有些事情有效,有些无效?您是否尝试过附加 JConsole 等并有一个高峰?
如果您有一个非常大的 VM,您可能会发现 64 位的 GC 问题会影响您。
第一个问题是,第二个问题不是;它是一个虚拟机。您的问题可能与版本之间库实现的未指定更改有关。虽然它可能是一个竞争条件。
虚拟机必须经历一些障碍。值得注意的是,引用在类文件中被视为int
与堆栈上的 s 占用相同的空间。double
并long
占用两个参考槽。例如字段,VM 通常会进行一些重新排列。这一切都是(相对)透明地完成的。
一些 64 位 JVM 也使用“压缩 oops”。因为数据大约每 8 或 16 个字节对齐一次,所以地址的 3 或 4 位是无用的(尽管某些算法可能会窃取“标记”位)。这允许 32 位地址数据(因此使用一半的带宽,因此速度更快)在 64 位平台上使用 35 位或 36 位的堆大小。
所有字节码都是基于 8 位的。(这就是为什么它被称为 BYTE 代码)所有指令的大小都是 8 位的倍数。我们在 32 位机器上开发并使用 64 位 JVM 运行我们的服务器。
您能否详细说明您面临的问题?那么我们可能有机会帮助你。否则,我们只会猜测您遇到了什么问题。
除非您有本机代码(为特定架构编译的机器代码),否则您的代码将在 32 位和 64 位 JVM 中同样运行良好。
但是请注意,由于更大的地址(32 位是 4 个字节,64 位是 8 个字节),对于相同的任务,64 位 JVM 将需要比 32 位 JVM 更多的内存。
当您与本机库交互时,32 位与 64 位的区别确实变得更加重要。64 位 Java 将无法与 32 位非 Java dll 交互(通过 JNI)
在创建 exe 时在配置中添加如下参数
我希望它有所帮助。
谢谢...
/jav
Java JNI 需要与 JVM 具有相同“bittiness”的操作系统库。例如,如果您尝试构建依赖于 IESHIMS.DLL(位于 %ProgramFiles%\Internet Explorer 中)的东西,则当您的 JVM 为 32 位时,您需要使用 32 位版本,当您的 JVM 为 64 位时,您需要使用 64 位版本。对于其他平台也是如此。
除此之外,您应该已准备就绪。生成的 Java 字节码 s/b 相同。
请注意,对于较大的项目,您应该使用 64 位 Java 编译器,因为它可以处理更多内存。
哟哪里错了!针对这个主题,我向 oracle 写了一个问题。答案是。
“如果你在 32 位机器上编译你的代码,你的代码应该只在 32 位处理器上运行。如果你想在 64 位 JVM 上运行你的代码,你必须使用 64 位机器在 64 位机器上编译你的类文件- 位 JDK。”