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

1. Oversigt

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

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

Først viser vi, hvordan man opnår dette ved hjælp af System klasse.

Derefter vil vi se, hvordan man bruger Java Native Access (JNA) API til at kontrollere JVM's bitthed. JNA er et community-udviklet bibliotek, der muliggør al indfødt adgang.

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

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

Vi kan bruge “sun.arch.data.model”Systemegenskab til identifikation af JVM-bithed:

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

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

Lad os se koden:

offentlig klasse JVMBitVersion {public String getUsingSystemClass () {return System.getProperty ("sun.arch.data.model") + "-bit"; } // ... andre metoder} 

Lad os kontrollere denne tilgang gennem en enhedstest:

@Test offentlig ugyldig nårUsingSystemClass_thenOutputIsAsExpected () {if ("64" .equals (System.getProperty ("sun.arch.data.model"))) {assertEquals ("64-bit", jvmVersion.getUsingSystemClass ()); } ellers hvis ("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.

Det bruger native funktioner til at indlæse et bibliotek ved navn og hente en markør til en funktion inden for dette bibliotek.

3.1. Hjemmehørende Klasse

Vi kan bruge POINTER_SIZE fra Hjemmehørende klasse. Denne konstant angiver størrelsen (i byte) af en indfødt markør på den aktuelle platform.

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

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

3.2. Platform Klasse

Alternativt kan vi bruge Platform klasse, som giver forenklet platforminformation.

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

Lad os se, hvordan det identificerer bitness:

offentlig statisk endelig boolsk is64Bit () {String model = System.getProperty ("sun.arch.data.model", System.getProperty ("com.ibm.vm.bitmode")); if (model! = null) {return "64" .equals (model); } hvis ("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; } returner Native.POINTER_SIZE == 8; }

Her, den BÅGE konstant er afledt af “os.ark”Ejendom via System klasse. Det bruges til at få operativsystemarkitektur:

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

Denne tilgang fungerer for forskellige operativsystemer og også for forskellige JDK-leverandører. Derfor er det mere pålideligt end “sun.arch.data.model”Systemegenskab.

4. Konklusion

I denne vejledning lærte vi, hvordan man kontrollerer 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.


$config[zx-auto] not found$config[zx-overlay] not found