Java 32位与64位兼容
将Java代码构build和编译为32位JDK转换为32位字节代码是否适用于64位JVM? 或者一个64位的JVM需要64位的字节码?
为了给出更多的细节,我有一个在运行32位JVM的Solaris环境中工作的代码,但是现在我在将JDK和Weblogic Server升级到64位后遇到了问题。
是的,假设您使用独立于平台的库,Java字节码(和源代码)是独立于平台的。 32与64位应该没有关系。
我不小心在一个64位的虚拟机上运行我们的(大的)应用程序,而不是一个32位的虚拟机,直到一些外部库(由JNI调用)开始失败时才注意到。
在32位平台上序列化的数据在64位平台上读入,完全没有问题。
你得到什么样的问题? 做一些事情而不是别人? 你有没有尝试附加JConsole等,并有高峰?
如果你有一个非常大的虚拟机,你可能会发现64位的GC问题会影响你。
对第一个问题是,对第二个问题不是。 这是一个虚拟机。 您的问题可能与版本之间库实现的未指定更改有关。 虽然它可能是比赛条件。
虚拟机需要经过一些环节。 值得注意的是,引用在类文件中被视为与堆栈中的int
相同。 double
和long
占用两个参考槽。 举例来说,虚拟机通常会经历一些重新安排。 这一切都完成(相对)透明。
另外一些64位JVM使用“压缩的oops”。 由于数据大约每8或16个字节alignment,所以地址的三或四位是无用的(尽pipe某些algorithm可能会盗取“标记”位)。 这允许在64位平台上使用32位地址数据(因此使用一半的带宽,因此速度更快),以使用35或36位的堆大小。
所有的字节码都是基于8位的。 (这就是为什么它被称为BYTE代码)所有的指令都是8位的倍数。 我们在32位机器上开发,并使用64位JVM运行我们的服务器。
你能详细谈谈你面临的问题吗? 那么我们可能有机会帮助你。 否则,我们只能猜测你现在面临的问题是什么。
除非你有本地代码(为特定的arcitechture编译的机器代码),否则你的代码在32位和64位的JVM中运行的同样好。
但是请注意,由于较大的地址(32位是4字节,64位是8字节),对于同一任务,64位JVM将比32位JVM需要更多的内存。
当与本地库连接时,32位与64位的差异变得更加重要。 64位Java将无法与32位非Java dll(通过JNI)
在创buildexe时,在configuration中添加一个参数如下
我希望它有帮助。
谢谢…
/ JAV
Java JNI需要与JVM具有相同“琐碎”的操作系统库。 如果您尝试构build一些依赖于IESHIMS.DLL(位于%ProgramFiles%\ Internet Explorer)中的某些内容,那么当您的JVM为32位时需要32位版本,而当您的JVM为64位时,则需要64位版本。 同样适用于其他平台。
除此之外,你应该全部设置。 生成的Java字节码s / b相同。
请注意,您应该使用64位Java编译器来处理更大的项目,因为它可以处理更多的内存。
哟哪里错了! 为了这个主题,我向oracle写了一个问题。 答案是。
“如果你在32位机器上编译你的代码,你的代码只能在32位处理器上运行,如果你想在64位JVM上运行代码,你必须在64位机器上使用64位编译你的类文件 – 位JDK“。