检查Java程序是在64位还是32位JVM中运行

2025/03/17

1. 概述

尽管Java是平台无关的,但有时我们不得不使用本地库。在这些情况下,我们可能需要识别底层平台并在启动时加载适当的本机库。

在本教程中,我们将学习检查Java程序是在64位还是32位JVM上运行的不同方法。

首先,我们将展示如何使用System类实现此目的。

然后,我们将了解如何使用Java Native Access(JNA) API检查JVM的位数。JNA是一个社区开发的库,支持所有本机访问。

2. 使用sun.arch.data.model系统属性

Java中的System类提供对外部定义的属性和环境变量的访问,它维护一个Properties对象,该对象描述当前工作环境的配置。

我们可以使用“sun.arch.data.model”系统属性来识别JVM位数:

System.getProperty("sun.arch.data.model");

它包含“32”或“64”,分别表示32位或64位JVM。尽管这种方法易于使用,但如果该属性不存在,它会返回“unknown”。因此,它只适用于Oracle Java版本

让我们看看代码:

public class JVMBitVersion {
    public String getUsingSystemClass() {
        return System.getProperty("sun.arch.data.model") + "-bit";
    }
 
    //... other methods
}

让我们通过单元测试来检查这种方法:

@Test
public void whenUsingSystemClass_thenOutputIsAsExpected() {
    if ("64".equals(System.getProperty("sun.arch.data.model"))) {
        assertEquals("64-bit", jvmVersion.getUsingSystemClass());
    } else if ("32".equals(System.getProperty("sun.arch.data.model"))) {
        assertEquals("32-bit", jvmVersion.getUsingSystemClass());
    }
}

3. 使用JNA API

JNA(Java Native Access)支持各种平台,例如macOS、Microsoft Windows、Solaris、GNU和Linux。

它使用本机函数按名称加载库并检索指向该库中函数的指针。

3.1 Native类

我们可以使用Native类中的POINTER_SIZE,此常量指定当前平台上本机指针的大小(以字节为单位)。

值4表示32位本机指针,而值8表示64位本机指针:

if (com.sun.jna.Native.POINTER_SIZE == 4) {
    // 32-bit
} else if (com.sun.jna.Native.POINTER_SIZE == 8) {
    // 64-bit
}

3.2 Platform类

或者,我们可以使用Platform类,它提供简化的平台信息。

它包含检测JVM是否为64位的is64Bit()方法

让我们看看它如何识别位数:

public static final boolean is64Bit() {
    String model = System.getProperty("sun.arch.data.model",
                                      System.getProperty("com.ibm.vm.bitmode"));
    if (model != null) {
        return "64".equals(model);
    }
    if ("x86-64".equals(ARCH)
        || "ia64".equals(ARCH)
        || "ppc64".equals(ARCH) || "ppc64le".equals(ARCH)
        || "sparcv9".equals(ARCH)
        || "mips64".equals(ARCH) || "mips64el".equals(ARCH)
        || "amd64".equals(ARCH)
        || "aarch64".equals(ARCH)) {
        return true;
    }
    return Native.POINTER_SIZE == 8;
}

在这里,ARCH常量是通过System类从“os.arch”属性派生的,它用于获取操作系统架构:

ARCH = getCanonicalArchitecture(System.getProperty("os.arch"), osType);

这种方法适用于不同的操作系统,也适用于不同的JDK供应商。因此,它比“sun.arch.data.model”系统属性更可靠。

4. 总结

在本教程中,我们学习了如何检查JVM位版本,我们还观察了JNA如何在不同平台上为我们简化解决方案。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章