Java 32位与64位兼容性


97

针对32位JDK构建和编译为32位字节代码的Java代码是否可以在64位JVM中工作?还是64位JVM需要64位字节代码?

为了提供更多细节,我有在运行32位JVM的Solaris环境中工作的代码,但是现在将JDK和Weblogic Server升级到64位后遇到了问题。


3
请澄清“问题”。
托尔比约恩Ravn的安徒生

我遇到类似的问题-在64位Weblogic服务器上部署spring应用程序。我们得到各种类未找到的异常以及其他无用的错误。此外,它可以在某些64位计算机上部署和运行,但不能在其他计算机上运行。但是,我们不知道有什么不同。你解决了吗?
2009年

2
@nont-无论出什么问题,它都不是32vs64位编译。
斯蒂芬·C

Answers:


94

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


我在寻找问题时遇到了这个问题。所以我在32位JVM下运行我的应用程序,并使用64位本机库。运行良好。但是,当我在64位JVM下运行我的应用程序并使用32位本机库时,它会失败。这怎么可能呢?只是好奇。
Umang Desai 2013年

6
@umangdesai本地库不是独立于平台的库,因此该假设不成立。
托尔比约恩Ravn的安徒生

“无关紧要”是否意味着用32位编译的代码javac将利用64位可用的内存java
Marcus Junius Brutus

1
如果您对此感到不满意,请当心那些捆绑在一个罐子中的本机库,该罐子可以在一个平台上使用,但不能在那些给您带来问题的平台上使用。(如果您不知道我要指的是什么,请参阅以下内容:stackoverflow.com/a/14051512/155631)。
Matt S.

21

我不小心在64位VM而不是32位VM上运行了(大型)应用程序,直到某些外部库(由JNI调用)开始出现故障时才注意到。

在64位平台上读入在32位平台上序列化的数据,没有任何问题。

您遇到什么样的问题?某些事情有效吗?您是否尝试过附加JConsole等并且周围有一个高峰?

如果您的VM很大,您可能会发现64位GC问题会影响您。


1
您是说如果JNI库为32位,则无法在64位VM中运行?
C. Ross,2010年

1
他们不工作。一位同事报告说他们做了(我发现可疑,至少可以这样说)。我想知道他是否在Solaris上运行,并且出现了一些问题。没有 他弄错了,它运行在32位以下。
Fortyrunner

我在JNI库中遇到了类似的问题。32位和64位库之间没有兼容性。
埃里克·罗伯逊

确实,您的JNI库需要替换。您可能只需从供应商的网站下载64位替代产品。(对于我使用的所有JNI库,这对我来说都是成功的窍门)。
bvdb 2014年

这些是内部库和没有64位等效可用,所以回32位被天的顺序..
Fortyrunner

11

第一个问题是,第二个问题是。这是一个虚拟机。您的问题可能与版本之间的库实现中未指定的更改有关。尽管可能是一种竞赛情况。

VM必须克服一些困难。值得注意的是,引用在类文件中的处理方式就像它们int在堆栈上占用s 一样。doublelong占用两个参考插槽。例如,无论如何,VM通常都会进行一些重新布置。这一切都是(相对)透明地完成的。

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


3
你让我感到惊讶。我认为没有32位字节代码或64位字节代码之类的东西。
乔恩·斯基特

3
重新阅读您的答案-您确定不只是相反吗?(是,然后是。)
乔恩·斯基特

+1乔恩·斯基特(Jon Skeet)。我在写同样的评论,但被打了个电话。
迈克尔·迈尔斯

我的意思是“不,然后是”,但是问题反过来。已回滚编辑并进行了编辑(并添加了更多信息)。
Tom Hawtin-大头钉

4
@Jon Skeet:没有32位和64位字节码,但是当JITed时,JVM中的指针(通常)是32位或64位,具体取决于平台。借助压缩的OOPS,他们甚至可以在64位JVM上的许多地方使用32位指针。这样可以节省大量内存并增加代码局部性,从而提高速度。
约阿希姆·绍尔

9

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

您能否详细介绍一下您面临的问题?这样我们就有机会为您提供帮助。否则,我们只会猜测您遇到的问题。


8

除非您具有本机代码(针对特定Arcitechture编译的机器代码),否则您的代码将在32位和64位JVM中同样良好地运行。

但是请注意,由于地址更大(32位是4字节,64位是8字节),对于同一任务,64位JVM比32位JVM需要更多的内存。


另请注意,与32位系统上的32位JVM相比,64位系统上的32位JVM可能具有更多的可用内存,因此如果您“使用几GB的内存”可能是一个有趣的选择。 ”应用程序。
托尔比约恩Ravn的安德森

3

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


5
您没有为这个非常老的问题提供任何新内容。
奥斯汀·亨利


0

Java JNI要求OS库具有与JVM相同的“位数”。如果您尝试构建依赖于IESHIMS.DLL(位于%ProgramFiles%\ Internet Explorer中)的东西,则当JVM为32位时需要采用32位版本,而当JVM为64位时则需要采用64位版本。对于其他平台也是如此。

除此之外,您应该已经准备就绪。生成的Java字节码s / b相同。

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


-5

哟,哪里错了!针对这个主题,我向甲骨文提出了一个问题。答案是。

“如果在32位计算机上编译代码,则代码只能在32位处理器上运行。如果要在64位JVM上运行代码,则必须使用64位计算机在64位计算机上编译类文件。 -位JDK。”


5
字节码格式的Java代码通常被编译成相同的,无论32位或64位平台。对于任何本机代码,规则都不同,但是Java字节代码是可移植的。
McDowell

4
是的,看起来Oracle的任何人在回答您的问题时都会误解它,或者对JVM一无所知。
圣保罗Ebermann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.