Java 如何在64位Linux上运行32位JVM?

Java 如何在64位Linux上运行32位JVM?,java,jvm,64-bit,Java,Jvm,64 Bit,我正在尝试在64位Debian Mint机器上运行32位Hotspot JVM。乍一看,这一切都很有效,直到您尝试使用Swing运行某些东西: java.lang.UnsatisfiedLinkError: /opt/javadev/jdk1.7.0_03_32b/jre/lib/i386/xawt/libmawt.so: libXext.so.6: cannot open shared object file: No such file or directory 将其添加到库路径:ex

我正在尝试在64位Debian Mint机器上运行32位Hotspot JVM。乍一看,这一切都很有效,直到您尝试使用Swing运行某些东西:

java.lang.UnsatisfiedLinkError: /opt/javadev/jdk1.7.0_03_32b/jre/lib/i386/xawt/libmawt.so:   
libXext.so.6: cannot open shared object file: No such file or directory
将其添加到库路径:
export LD_library_path=/usr/lib/x86_64-linux-gnu

但它给出了这个错误:

java.lang.UnsatisfiedLinkError: /opt/javadev/jdk1.7.0_03_32b/jre/lib/i386/xawt/libmawt.so: 
libXext.so.6: wrong ELF class: ELFCLASS64

知道这里还需要做什么吗?

要使用32位JVM,您需要安装32位兼容性库。第二条错误消息表示32位JVM进程正在尝试加载64位库;那不行

在Ubuntu上,您必须安装包
ia32 libs
,其中包含64位Ubuntu的32位兼容性库


更新:Ubuntu 13.10引入了multi-arch,它用
libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurse5:i386取代了
ia32 libs
。来源:

如果要使用32位引用,请使用64位JVM。默认情况下,它使用32位引用来自Java6Update23的32 GB内存(超过一个32位程序通常可以使用的内存)

@热舔评论IBM JVM可以通过“32/64位模式”访问高达68 GB


如果您需要使用超过这个数量的内存(或者类似的内存),我会使用堆外内存。这可以控制完整的GC时间,意味着您可以始终使用32位引用。

我在CentOS 6.4中遇到过类似的问题,解决方案是安装ia32 libs等价物(作为根用户):
yum install glibc.i686 libXext.i686 libXtst.i686

我刚刚在Ubuntu 14.04上遇到了同样的问题,我想将我的32位Oracle Java保留在64位安装上。IA32libs从Ubuntu13.10开始就不存在了,现在的答案是“只需下载您需要的i386库”。不幸的是,似乎没有一个简单的方法来找出那些是哪些库

简单的补救方法是将32位OpenJDK安装为

sudo apt-get install openjdk-7-jdk:i386
这就引入了大量i386库。如果愿意,您可以再次卸载OpenJDK,但我将其保留在原位,这样就不会意外地自动删除库


将oraclejdk放到这个路径上,现在Eclipse和NetBeans将正常启动

32位进程无法加载64位库。您需要安装32位兼容库。在Ubuntu上,您需要安装包
ia32 libs
。我不知道Debian上的等价物是什么。你为什么又试图在64位机器上运行32位JVM?@Jesper就是这么做的!如果您愿意,请将其作为答案归档。非常感谢-D@Marcelo主要是出于性能原因。在我的例子中,用非常大的C++项目运行NETBeBes。32位JVM比64位JVM性能更好,因为引用的大小只有64位的一半。允许更多的数据放入缓存。导致更高的性能。(这至少是我读到的)在我的例子中,我在Netbeans初始化项目时创建了大量对象。在我的例子中,它可以降低内存占用。@Marcelo——32位JVM通常比64位JVM在更小的堆中运行(因此速度更快)。一个折衷方案是IBMJ9JVM,它有一个“32/64位模式”,允许堆接近68G,而只使用32位指针。谢谢!我不知道现在默认启用了“压缩oops”。这就是为什么它对Netbeans没有任何影响。它已经在使用32位引用。因此,最终这没有任何区别。奇怪的是,Netbeans支持团队让我运行32位JVM……当我看到关于哪一个5-10年过时的建议时,我常常感到惊讶假设一个64位进程使用64位指针是很自然的,在C语言中使用64位指针被认为是最有效的。我想在某种程度上它会更好。但是有很多人告诉我,客户机JVM(32位)的速度要快一些。在最近的一本书《Java性能》中指出,这是因为一些缓存包含更多的条目,因为它们更小。因此,更高的命中率。因此,性能有所提高。我总是在运行压缩的OOP。但是直到现在它被忽略了,默认情况下它被应用于32GB或更低。非常感谢Cayhorstmann的回答。救了我的命!ia32 LIB不再存在。这个解决了问题,谢谢!我尝试了上面的方法,但是没有可用的包。没有可用的包glibc.i686。没有可用的libXext.i686包。没有可用的libXtst.i686软件包。CentOS/RedHat/Fedora用户对此表示感谢。只需注意,对于最新的JRE/JDK,还需要libgcc.i686包。