Sjekk om et Java-program kjører i 64-biters eller 32-biters JVM

1. Oversikt

Selv om Java er plattformuavhengig, er det tidspunkter når vi må bruke innfødte biblioteker. I slike tilfeller kan det hende vi trenger å identifisere den underliggende plattformen og laste inn de aktuelle innfødte bibliotekene ved oppstart.

I denne opplæringen lærer vi forskjellige måter å sjekke om et Java-program kjører på en 64-biters eller 32-biters JVM.

Først viser vi hvordan du kan oppnå dette ved hjelp av System klasse.

Så får vi se hvordan du bruker Java Native Access (JNA) API for å sjekke bitheten til JVM. JNA er et samfunnsutviklet bibliotek som muliggjør all innfødt tilgang.

2. Bruke sol.ark.data.modell Systemegenskap

De System klasse i Java gir tilgang til eksternt definerte egenskaper og miljøvariabler. Det opprettholder en Eiendommer objekt som beskriver konfigurasjonen av gjeldende arbeidsmiljø.

Vi kan bruke “sol.ark.data.modell”Systemegenskap for å identifisere JVM-bithet:

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

Den inneholder “32” eller “64” for å indikere henholdsvis en 32-biters eller 64-biters JVM. Selv om denne tilnærmingen er enkel å bruke, returnerer den "ukjent" hvis eiendommen ikke er til stede. Derfor fungerer den bare med Oracle Java-versjoner.

La oss se koden:

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

La oss sjekke denne tilnærmingen gjennom en enhetstest:

@Test offentlig ugyldig nårUsingSystemClass_thenOutputIsAsExpected () {if ("64" .equals (System.getProperty ("sun.arch.data.model"))) {assertEquals ("64-bit", jvmVersion.getUsingSystemClass ()); } annet hvis ("32" .equals (System.getProperty ("sun.arch.data.model"))) {assertEquals ("32-bit", jvmVersion.getUsingSystemClass ()); }}

3. Bruke JNA API

JNA (Java Native Access) støtter forskjellige plattformer som macOS, Microsoft Windows, Solaris, GNU og Linux.

Den bruker innfødte funksjoner for å laste et bibliotek etter navn og hente en peker til en funksjon i det biblioteket.

3.1. Innfødt Klasse

Vi kan bruke POINTER_SIZE fra Innfødt klasse. Denne konstanten spesifiserer størrelsen (i byte) på en innfødt peker på gjeldende plattform.

En verdi på 4 indikerer en 32-biters native-peker, mens en verdi på 8 indikerer en 64-biters native-peker:

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

3.2. Plattform Klasse

Alternativt kan vi bruke Plattform klasse, som gir forenklet plattforminformasjon.

Det inneholder de is64Bit () metode som oppdager om JVM er 64-bit eller ikke.

La oss se hvordan den identifiserer bitheten:

offentlig statisk slutt boolsk is64Bit () {Strengmodell = 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; } returner Native.POINTER_SIZE == 8; }

Her, den BÅGE konstant er avledet fra “os.ark”Eiendom via System klasse. Den brukes til å få operativsystemarkitektur:

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

Denne tilnærmingen fungerer for forskjellige operativsystemer og også for forskjellige JDK-leverandører. Derfor er det mer pålitelig enn “sol.ark.data.modell”Systemegenskap.

4. Konklusjon

I denne opplæringen lærte vi hvordan du sjekker JVM-bitversjonen. Vi observerte også hvordan JNA forenklet løsningen for oss på forskjellige plattformer.

Som alltid er den komplette koden tilgjengelig på GitHub.


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