How can I tell if I'm running in 64-bit JVM or 32-bit JVM (from within a program)?

前端 未结 12 1985
滥情空心
滥情空心 2020-11-22 09:39

How can I tell if the JVM in which my application runs is 32 bit or 64-bit? Specifically, what functions or properties I can used to detect this within the program?

12条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 10:19

    This is the way JNA solves this with Platform.is64Bit() (https://github.com/java-native-access/jna/blob/master/src/com/sun/jna/Platform.java)

     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 = getCanonicalArchitecture(System.getProperty("os.arch"), osType);
    
    static String getCanonicalArchitecture(String arch, int platform) {
            arch = arch.toLowerCase().trim();
            if ("powerpc".equals(arch)) {
                arch = "ppc";
            }
            else if ("powerpc64".equals(arch)) {
                arch = "ppc64";
            }
            else if ("i386".equals(arch) || "i686".equals(arch)) {
                arch = "x86";
            }
            else if ("x86_64".equals(arch) || "amd64".equals(arch)) {
                arch = "x86-64";
            }
            // Work around OpenJDK mis-reporting os.arch
            // https://bugs.openjdk.java.net/browse/JDK-8073139
            if ("ppc64".equals(arch) && "little".equals(System.getProperty("sun.cpu.endian"))) {
                arch = "ppc64le";
            }
            // Map arm to armel if the binary is running as softfloat build
            if("arm".equals(arch) && platform == Platform.LINUX && isSoftFloat()) {
                arch = "armel";
            }
    
            return arch;
        }
    
    static {
            String osName = System.getProperty("os.name");
            if (osName.startsWith("Linux")) {
                if ("dalvik".equals(System.getProperty("java.vm.name").toLowerCase())) {
                    osType = ANDROID;
                    // Native libraries on android must be bundled with the APK
                    System.setProperty("jna.nounpack", "true");
                }
                else {
                    osType = LINUX;
                }
            }
            else if (osName.startsWith("AIX")) {
                osType = AIX;
            }
            else if (osName.startsWith("Mac") || osName.startsWith("Darwin")) {
                osType = MAC;
            }
            else if (osName.startsWith("Windows CE")) {
                osType = WINDOWSCE;
            }
            else if (osName.startsWith("Windows")) {
                osType = WINDOWS;
            }
            else if (osName.startsWith("Solaris") || osName.startsWith("SunOS")) {
                osType = SOLARIS;
            }
            else if (osName.startsWith("FreeBSD")) {
                osType = FREEBSD;
            }
            else if (osName.startsWith("OpenBSD")) {
                osType = OPENBSD;
            }
            else if (osName.equalsIgnoreCase("gnu")) {
                osType = GNU;
            }
            else if (osName.equalsIgnoreCase("gnu/kfreebsd")) {
                osType = KFREEBSD;
            }
            else if (osName.equalsIgnoreCase("netbsd")) {
                osType = NETBSD;
            }
            else {
                osType = UNSPECIFIED;
            }
    }
    

提交回复
热议问题