Java >> Java tutorial >  >> JVM

Tjek, om et Java-program kører i 64-bit eller 32-bit JVM

1. Oversigt

Selvom Java er platform-uafhængig, er der tidspunkter, hvor vi er nødt til at bruge native biblioteker. I disse tilfælde skal vi muligvis identificere den underliggende platform og indlæse de relevante native biblioteker ved opstart.

I denne øvelse lærer vi forskellige måder at kontrollere, om et Java-program kører på en 64-bit eller 32-bit JVM.

Først vil vi vise, hvordan du opnår dette ved hjælp af Systemet klasse.

Derefter vil vi se, hvordan du bruger Java Native Access (JNA) API til at kontrollere bitheden af ​​JVM. JNA er et fællesskabsudviklet bibliotek, der muliggør al indbygget adgang.

2. Brug af sun.arch.data.model Systemegenskab

Systemet klasse i Java giver adgang til eksternt definerede egenskaber og miljøvariabler. Det opretholder en Egenskaber objekt, der beskriver konfigurationen af ​​det aktuelle arbejdsmiljø.

Vi kan bruge "sun.arch.data.model ” systemegenskab til at identificere JVM-bithed:

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

Den indeholder "32" eller "64" for at angive en henholdsvis 32-bit eller 64-bit JVM. Selvom denne tilgang er nem at bruge, returnerer den "ukendt", hvis ejendommen ikke er til stede. Derfor fungerer det kun med Oracle Java-versioner.

Lad os se koden:

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

Lad os tjekke denne tilgang gennem en enhedstest:

@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. Brug af JNA API

JNA (Java Native Access) understøtter forskellige platforme såsom macOS, Microsoft Windows, Solaris, GNU og Linux.

Den bruger indbyggede funktioner til at indlæse et bibliotek efter navn og hente en pointer til en funktion i det bibliotek.

3.1. Native Klasse

Vi kan bruge POINTER_SIZE fra Native klasse. Denne konstant angiver størrelsen (i bytes) af en indbygget pointer på den aktuelle platform.

En værdi på 4 angiver en 32-bit native pointer, mens en værdi på 8 angiver en 64-bit native pointer:

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

3.2. Platform Klasse

Alternativt kan vi bruge Platformen klasse, som giver forenklet platformsinformation.

Den indeholder den is64Bit() metode, der registrerer, om JVM er 64-bit eller ej .

Lad os se, hvordan den identificerer bitheden:

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;
}

Her er ARCH konstant er afledt af "os.arch ” egenskab via System klasse. Det bruges til at få operativsystemarkitektur:

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

Denne tilgang fungerer for forskellige operativsystemer og også med forskellige JDK-leverandører. Derfor er den mere pålidelig end "sun.arch.data.model ” systemegenskab.

4. Konklusion

I denne tutorial lærte vi, hvordan man tjekker JVM-bitversionen. Vi observerede også, hvordan JNA forenklede løsningen for os på forskellige platforme.

Som altid er den komplette kode tilgængelig på GitHub.


Java tag