Java 32位与64位兼容性

时间:2009-04-23 21:48:08

标签: java jvm 64-bit compatibility 32-bit

将针对32位JDK构建和编译的Java代码转换成32位字节代码可以在64位JVM中运行吗?或者64位JVM是否需要64位字节代码?

为了更详细一点,我的代码在运行32位JVM的Solaris环境中运行,但现在我在将JDK和Weblogic Server升级到64位后遇到了问题。

9 个答案:

答案 0 :(得分:91)

是的,假设您使用独立于平台的库,Java字节码(和源代码)与平台无关。 32对64位应该无关紧要。

答案 1 :(得分:20)

我不小心在64位虚拟机而不是32位虚拟机上运行我们的(大型)应用程序,直到某些外部库(由JNI调用)开始失败才发现它们。

在32位平台上序列化的数据在64位平台上读取,完全没有问题。

你得到了什么问题?做一些事情而不是其他事情吗?您是否尝试过附加JConsole等并且有一个高峰?

如果您有一个非常大的VM,您可能会发现64位的GC问题可能会影响您。

答案 2 :(得分:11)

第一个问题是,第二个问题不是;它是一个虚拟机。您的问题可能与版本之间的库实现中未指定的更改有关。虽然可能是比赛条件。

虚拟机必须经历一些箍。值得注意的是,引用在类文件中被处理,就好像它们在堆栈上占用int s一样的空间。 doublelong占用两个参考位。例如字段,VM通常会经历一些重新排列。这一切都是(相对)透明地完成的。

一些64位JVM也使用“压缩oops”。因为数据大约每8或16个字节对齐,所以地址的3或4位是无用的(尽管某些算法可能会窃取“标记”位)。这允许32位地址数据(因此使用一半的带宽,因此更快)在64位平台上使用35或36位的堆大小。

答案 3 :(得分:10)

所有字节代码都是基于8位的。 (这就是它所谓的BYTE代码的原因)所有指令都是8位大小的倍数。 我们在32位计算机上开发并使用64位JVM运行我们的服务器。

您能详细说明您所面临的问题吗?然后我们可能有机会帮助你。否则我们只会猜测你遇到的问题。

答案 4 :(得分:8)

除非你有本机代码(为特定的arcitechture编译的机器代码),否则你的代码在32位和64位JVM中运行同样好。

但是,请注意,由于较大的地址(32位是4个字节,64位是8个字节),64位JVM将需要比32位JVM更多的内存来执行相同的任务。

答案 5 :(得分:3)

当您与本机库连接时,32位与64位的区别确实变得更加重要。 64位Java将无法与32位非Java dll(通过JNI)进行交互

答案 6 :(得分:2)

在创建exe

时,在配置中添加如下参数

http://www.technimi.com/index.php?do=/group/java/forum/building-an-exe-using-launch4j-for-32-bit-jvm/

我希望它有所帮助。谢谢...... / jav

答案 7 :(得分:0)

Java JNI要求与JVM具有相同“bittiness”的OS库。如果您尝试构建依赖于IESHIMS.DLL(位于%ProgramFiles%\ Internet Explorer中)的内容,则需要在JVM为32位时使用32位版本,在JVM为64位时使用64位版本。同样适用于其他平台。

除此之外,你应该全力以赴。生成的Java字节码s / b相同。

请注意,对于较大的项目,您应该使用64位Java编译器,因为它可以处理更多内存。

答案 8 :(得分:-5)

哟哪里错了!对于这个主题,我向oracle写了一个问题。答案是。

“如果你在32位机器上编译你的代码,你的代码应该只在32位处理器上运行。如果你想在64位JVM上运行你的代码,你必须在64位机器上编译你的类文件使用64位JDK。“