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

21

我正试图在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

还有什么其他事情需要在这里完成吗?


5
32位进程无法加载64位库。您需要安装32位兼容性库。在Ubuntu上,您需要安装“ia32-libs”软件包。不知道在Debian上对应的软件包是什么。 - Jesper
1
你为什么要在64位机器上再次尝试运行32位JVM呢? - Marcelo
@ Jesper,就是这样!如果您愿意,请将其归档为答案。非常感谢! :-D - Jan Goyvaerts
@Qwe 现在我明白了 :-) 在 Jesper 的建议下。但非常感谢您的迅速回复。 :-) - Jan Goyvaerts
2
@Marcelo -- 一个32位的JVM通常会在比64位的更小的堆内存中运行(因此更快)。IBM J9 JVM是一种折衷方案,它具有“32/64位模式”,可以在仅使用32位指针的情况下允许接近68G的堆。 - Hot Licks
显示剩余3条评论
4个回答

15
要使用32位的JVM,需要安装32位兼容库。第二个错误信息表示32位的JVM进程尝试加载64位的库,这是不支持的。
在Ubuntu上,您需要安装ia32-libs软件包,该软件包包含64位Ubuntu的32位兼容库。
更新: Ubuntu 13.10引入了多架构,用libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386替代了ia32-libs。来源:https://dev59.com/TXE85IYBdhLWcg3wkkfK#10473415

14

我在Ubuntu 14.04上遇到了相同的问题,我想在64位安装中保留我的32位Oracle Java。自Ubuntu 13.10起,ia32-libs就不再存在了,现在glib的答案是“只需下载您需要的i386库”。不幸的是,似乎没有一种简单的方法找出哪些库。

简单的解决方法是安装32位OpenJDK,命令如下:

sudo apt-get install openjdk-7-jdk:i386

这会涉及到大量的i386库。如果您想的话,可以再次卸载OpenJDK,但我将其保留,以防意外自动删除库。

将Oracle JDK添加到PATH中,现在Eclipse和NetBeans将可以正常启动。


非常感谢您的回答,Cayhorstmann。救了我的一命! - mbrinson
ia32-libs已经不存在了。这个解决了问题,谢谢! - Renaud Denis

7

我遇到过类似的问题,使用CentOS 6.4时解决方法是安装ia32-libs相关组件 (作为root用户): yum install glibc.i686 libXext.i686 libXtst.i686


我尝试了上述方法,但是出现了“没有可用的软件包”错误。glibc.i686软件包不可用。libXext.i686软件包不可用。libXtst.i686软件包不可用。 - java_enthu
1
感谢 CentOS/RedHat/Fedora 用户的支持。请注意,对于最新的 JRE/JDK,还需要安装 libgcc.i686 包。 - Dime

4
如果您想使用32位引用,请使用64位JVM。从Java 6更新23开始,默认情况下,它最多可以使用32 GB的内存(比32位程序通常更多)。@Hot Licks评论说IBM JVM可以通过“32/64位模式”访问高达68 GB。
如果您需要使用更多的内存(或类似的任何事情),那么我建议使用堆外内存。这将使全GC时间得到控制,并且意味着您始终可以使用32位引用。 http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html

谢谢!我不知道“压缩的oops”现在默认启用了。这就是为什么对于Netbeans没有任何区别的原因。它已经使用了32位引用。所以最终并没有任何区别。奇怪的是,Netbeans支持团队要求我运行32位JVM... - Jan Goyvaerts
当我看到SO上的建议已经过时5-10年时,我经常感到惊讶。;)假设64位进程使用64位指针是很自然的,在C语言中这被认为是最有效率的。 - Peter Lawrey
我猜这样做某种程度上会更好。但是我曾听过很多人说客户端JVM(32位)会更快一些。在最近的一本书《Java性能》中也指出,这是因为某些缓存包含的条目更多,因为它们更小。因此,命中率更高,性能提高。我始终使用压缩的oops(普通对象指针压缩技术)。但直到现在才意识到默认情况下仅应用于32GB或更低容量。 - Jan Goyvaerts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接