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.