Überprüfen Sie, ob ein Java-Programm in 64-Bit- oder 32-Bit-JVM ausgeführt wird

1. Übersicht

Obwohl Java plattformunabhängig ist, müssen wir manchmal native Bibliotheken verwenden. In diesen Fällen müssen wir möglicherweise die zugrunde liegende Plattform identifizieren und die entsprechenden nativen Bibliotheken beim Start laden.

In diesem Tutorial erfahren Sie, wie Sie überprüfen können, ob ein Java-Programm auf einer 64-Bit- oder 32-Bit-JVM ausgeführt wird.

Zunächst zeigen wir, wie dies mithilfe der Systemklasse erreicht wird .

Anschließend erfahren Sie, wie Sie mithilfe der JNA-API (Java Native Access) die Bitigkeit der JVM überprüfen. JNA ist eine von der Community entwickelte Bibliothek, die allen nativen Zugriff ermöglicht.

2. Mit der sun.arch.data.model Systemeigenschaft

Die Systemklasse in Java bietet Zugriff auf extern definierte Eigenschaften und Umgebungsvariablen. Es verwaltet ein Eigenschaftenobjekt , das die Konfiguration der aktuellen Arbeitsumgebung beschreibt.

Wir können die Systemeigenschaft " sun.arch.data.model " verwenden, um die JVM-Bitigkeit zu identifizieren:

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

Es enthält "32" oder "64", um eine 32-Bit- bzw. 64-Bit-JVM anzuzeigen. Obwohl dieser Ansatz einfach zu verwenden ist, gibt er "unbekannt" zurück, wenn die Eigenschaft nicht vorhanden ist. Daher funktioniert es nur mit Oracle Java-Versionen.

Sehen wir uns den Code an:

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

Lassen Sie uns diesen Ansatz durch einen Unit-Test überprüfen:

@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. Verwenden der JNA-API

JNA (Java Native Access) unterstützt verschiedene Plattformen wie macOS, Microsoft Windows, Solaris, GNU und Linux.

Es verwendet native Funktionen, um eine Bibliothek nach Namen zu laden und einen Zeiger auf eine Funktion in dieser Bibliothek abzurufen.

3.1. Einheimische Klasse

Wir können POINTER_SIZE aus der Native- Klasse verwenden. Diese Konstante gibt die Größe (in Byte) eines nativen Zeigers auf der aktuellen Plattform an.

Ein Wert von 4 gibt einen nativen 32-Bit-Zeiger an, während ein Wert von 8 einen nativen 64-Bit-Zeiger angibt:

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

3.2. Plattform - Klasse

Alternativ können wir die Platform- Klasse verwenden, die vereinfachte Plattforminformationen bereitstellt.

Es enthält die Methode is64Bit () , die erkennt, ob die JVM 64-Bit ist oder nicht .

Mal sehen, wie es die Bitterkeit identifiziert:

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

Hier wird die ARCH- Konstante über die System- Klasse von der Eigenschaft „ os.arch “ abgeleitet . Es wird verwendet, um die Betriebssystemarchitektur abzurufen:

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

Dieser Ansatz funktioniert für verschiedene Betriebssysteme und auch für verschiedene JDK-Anbieter. Daher ist es zuverlässiger als die Systemeigenschaft " sun.arch.data.model ".

4. Fazit

In diesem Tutorial haben wir gelernt, wie Sie die JVM-Bit-Version überprüfen. Wir haben auch beobachtet, wie JNA die Lösung für uns auf verschiedenen Plattformen vereinfacht hat.

Wie immer ist der vollständige Code auf GitHub verfügbar.