Controleer of een Java-programma wordt uitgevoerd in 64-bits of 32-bits JVM

1. Overzicht

Hoewel Java platformonafhankelijk is, zijn er momenten dat we native bibliotheken moeten gebruiken. In die gevallen moeten we mogelijk het onderliggende platform identificeren en de juiste native bibliotheken laden bij het opstarten.

In deze zelfstudie leren we verschillende manieren om te controleren of een Java-programma wordt uitgevoerd op een 64-bits of 32-bits JVM.

Eerst laten we zien hoe u dit kunt bereiken met de Systeem klasse.

Vervolgens zullen we zien hoe we de Java Native Access (JNA) API kunnen gebruiken om de bitness van de JVM te controleren. JNA is een door de gemeenschap ontwikkelde bibliotheek die alle native toegang mogelijk maakt.

2. Gebruik de zon.arch.data.model Systeemeigenschap

De Systeem class in Java biedt toegang tot extern gedefinieerde eigenschappen en omgevingsvariabelen. Het onderhoudt een Eigendommen object dat de configuratie van de huidige werkomgeving beschrijft.

We kunnen de 'zon.arch.data.model”Systeemeigenschap om JVM-bitness te identificeren:

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

Het bevat "32" of "64" om respectievelijk een 32-bits of 64-bits JVM aan te duiden. Hoewel deze benadering eenvoudig te gebruiken is, wordt ‘onbekend’ geretourneerd als de eigenschap niet aanwezig is. Daarom werkt het alleen met Oracle Java-versies.

Laten we de code bekijken:

openbare klasse JVMBitVersion {openbare String getUsingSystemClass () {retour System.getProperty ("sun.arch.data.model") + "-bit"; } //... andere methodes } 

Laten we deze benadering eens bekijken door middel van een unit-test:

@Test openbare leegte 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. Met behulp van de JNA API

JNA (Java Native Access) ondersteunt verschillende platforms zoals macOS, Microsoft Windows, Solaris, GNU en Linux.

Het gebruikt native functies om een ​​bibliotheek op naam te laden en een pointer op te halen naar een functie binnen die bibliotheek.

3.1. Inheems Klasse

We kunnen gebruiken POINTER_SIZE van de Inheems klasse. Deze constante specificeert de grootte (in bytes) van een native pointer op het huidige platform.

Een waarde van 4 geeft een 32-bits native pointer aan, terwijl een waarde van 8 een 64-bits native pointer aangeeft:

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

Als alternatief kunnen we de Platform class, die vereenvoudigde platforminformatie biedt.

Het bevat de is64Bit () methode die detecteert of de JVM 64-bits is of niet.

Laten we eens kijken hoe het de bitheid identificeert:

openbare statische laatste boolean is64Bit () {String model = System.getProperty ("sun.arch.data.model", System.getProperty ("com.ibm.vm.bitmode")); if (model! = null) {retourneer "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; } retourneer Native.POINTER_SIZE == 8; }

Hier de BOOG constante is afgeleid van de "os.arch”Eigendom via de Systeem klasse. Het wordt gebruikt om de architectuur van het besturingssysteem te krijgen:

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

Deze aanpak werkt voor verschillende besturingssystemen en ook met verschillende JDK-leveranciers. Daarom is het betrouwbaarder dan de "zon.arch.data.model”Systeemeigenschap.

4. Conclusie

In deze tutorial hebben we geleerd hoe we de JVM-bitversie kunnen controleren. We zagen ook hoe JNA de oplossing voor ons vereenvoudigde op verschillende platforms.

Zoals altijd is de volledige code beschikbaar op GitHub.