在使用32位JDK编写和编译的Java代码能否在64位JVM上运行?或者说64位JVM是否需要64位字节码?
为了提供更多细节,我有一些代码曾经在运行32位JVM的Solaris环境中工作过,但现在在升级JDK和Weblogic Server到64位后出现了问题。
在使用32位JDK编写和编译的Java代码能否在64位JVM上运行?或者说64位JVM是否需要64位字节码?
为了提供更多细节,我有一些代码曾经在运行32位JVM的Solaris环境中工作过,但现在在升级JDK和Weblogic Server到64位后出现了问题。
是的,假设您使用平台无关的库,Java字节码(和源代码)是跨平台的。32位与64位并不重要。
javac
编译的代码是否能够利用 64 位 java
提供的内存并不重要? - Marcus Junius Brutus我不小心在64位虚拟机上运行了我们(相对较大的)应用程序,而不是32位虚拟机,在一些由JNI调用的外部库失败之前没有注意到。
在64位平台上读取32位平台上序列化的数据时,没有任何问题。
你遇到了什么样的问题?有些功能工作正常,而另一些则不行吗?你尝试过附加JConsole等工具并查看一下吗?
如果你使用非常大的虚拟机,你可能会发现64位GC问题会影响你。
对于第一个问题是肯定的,对于第二个问题是否定的;这是一个虚拟机。你的问题可能与版本之间未指定的库实现更改有关。尽管也可能是某种竞争条件。
虚拟机必须经过一些步骤。特别地,类文件中的引用被处理为在堆栈上占用与int
相同的空间。 double
和long
占用两个引用槽位。对于实例字段,虚拟机通常会进行一些重新排列。这都是(相对)透明完成的。
此外,一些64位JVM使用“压缩oops”。由于数据对齐到大约每8或16字节,地址中的三到四个位是无用的(尽管可以为一些算法窃取“标志”位)。这使得32位地址数据(因此使用一半带宽,因此更快)可以在64位平台上使用35位或36位的堆大小。
除非你有本地代码(针对特定架构编译的机器代码),否则你的代码将在32位和64位JVM中运行得一样好。
但是请注意,由于地址更大(32位为4字节,64位为8字节),相同任务的64位JVM将需要比32位JVM更多的内存。
当您与本地库进行接口操作时,32位与64位的差异变得更加重要。64位Java将无法通过JNI与32位非Java dll进行接口交互。
Java JNI需要与JVM相同“位数”的操作系统库。如果您尝试构建某个依赖于IESHIMS.DLL(位于%ProgramFiles%\Internet Explorer中)的东西,您需要在JVM为32位时使用32位版本,在JVM为64位时使用64位版本。其他平台也是如此。
除此之外,你应该已经准备好了。生成的Java字节码应该是相同的。
请注意,对于较大的项目,您应该使用64位Java编译器,因为它可以处理更多的内存。
嘿,你错了!对于这个主题,我向Oracle提出了一个问题。答案是:
“如果你在32位机器上编译代码,那么你的代码只能在32位处理器上运行。如果你想在64位JVM上运行你的代码,你必须使用64位JDK在64位机器上编译类文件。”