【问题标题】:How to run a 32bit JVM on a 64bit Linux?如何在 64 位 Linux 上运行 32 位 JVM?
【发布时间】:2012-03-12 17:08:45
【问题描述】:

我正在尝试在 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 位进程无法加载 64 位库。您需要安装 32 位兼容性库。在 Ubuntu 上,您需要安装包 ia32-libs。不知道 Debian 上的等价物是什么。
  • 为什么你又要在 64 位机器上运行 32 位 JVM?
  • @Jesper 做到了!如果您愿意,请将其归档为答案。非常感谢! :-D
  • @Marcelo 主要是出于性能原因。在我的例子中,使用一个非常大的 C++ 项目运行 Netbeans。与 64 位相比,32 位 JVM 的性能更好,因为引用的大小只有一半。允许将更多内容放入缓存中。从而获得更高的性能。 (这就是我至少读到的)在我的情况下,当 Netbeans 初始化项目时,我创建了 LOADS 对象。就我而言,它可以减少内存占用。
  • @Marcelo -- 与 64 位相比,32 位 JVM 通常在更小的堆中运行(因此更快)。折衷方案是 IBM J9 JVM,它具有“32/64 位模式”,允许堆接近 68G,同时仅使用 32 位指针。

标签: java jvm 64-bit


【解决方案1】:

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

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

更新:Ubuntu 13.10 引入了多架构,将 ia32-libs 替换为 libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386。来源:https://stackoverflow.com/a/10473415/14731

【讨论】:

    【解决方案2】:

    如果要使用 32 位引用,请使用 64 位 JVM。从 Java 6 update 23 开始,它默认使用 32 位引用来获得高达 32 GB 的内存(通常超过 32 位程序)。

    http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html

    @Hot Licks 让 IBM JVM 在“32/64 位模式”下最多可以访问 68 GB

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

    【讨论】:

    • 谢谢!我不知道现在默认启用“压缩 oops”。这就是为什么它对 Netbeans 没有任何影响。它已经在使用 32 位引用。所以最终它没有任何区别。奇怪的是 Netbeans 支持团队要求我运行 32 位 JVM...
    • 当我看到关于 SO 的建议已经过时了 5 到 10 年时,我常常感到惊讶。 ;) 假设 64 位进程使用 64 位指针是很自然的,它在 C 中使用,这被认为是最有效的。
    • 我想在某些方面会更好。但是我有很多人告诉客户端 JVM(32 位)要快一些。在最近的一本书“Java Performance”中,指出这是因为某些缓存包含更多条目,因为它们更小。因此,命中率更高。因此性能提高。我总是在运行压缩 oops 的情况下运行。但直到现在都被忽略了,它默认应用于 32GB 或更低。
    【解决方案3】:

    我在使用 CentOS 6.4 时遇到了类似的问题,解决方案是安装 ia32-libs 等效项(以 root 身份): yum install glibc.i686 libXext.i686 libXtst.i686

    【讨论】:

    • 我尝试了上述方法,但没有可用的软件包。没有可用的软件包 glibc.i686。没有可用的软件包 libXext.i686。没有可用的软件包 libXtst.i686。
    • 感谢 CentOS/RedHat/Fedora 用户。请注意,对于最新的 JRE/JDK,还需要 libgcc.i686 包。
    【解决方案4】:

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

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

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

    这会引入大量 i386 库。如果愿意,您可以再次卸载 OpenJDK,但我将其保留在原处,以免意外自动删除库。

    将 Oracle JDK 放在 PATH 上,现在 Eclipse 和 NetBeans 就可以正常启动了。

    【讨论】:

    • 非常感谢 Cayhorstmann 的回答。救了我的培根!
    • ia32-libs 不再存在。这个解决了问题,谢谢!
    猜你喜欢
    • 2012-11-03
    • 2012-03-19
    • 2011-05-13
    • 2013-09-16
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多