Verificare se un programma Java è in esecuzione in una JVM a 64 o 32 bit

1. Panoramica

Sebbene Java sia indipendente dalla piattaforma, ci sono momenti in cui dobbiamo usare le librerie native. In questi casi, potrebbe essere necessario identificare la piattaforma sottostante e caricare le librerie native appropriate all'avvio.

In questo tutorial, impareremo diversi modi per verificare se un programma Java è in esecuzione su una JVM a 64 o 32 bit.

Per prima cosa, mostreremo come ottenere ciò utilizzando la classe System .

Quindi, vedremo come utilizzare l'API Java Native Access (JNA) per controllare il bitness della JVM. JNA è una libreria sviluppata dalla comunità che consente tutti gli accessi nativi.

2. Utilizzo della proprietà di sistema sun.arch.data.model

La classe System in Java fornisce l'accesso a proprietà e variabili di ambiente definite esternamente. Mantiene un oggetto Proprietà che descrive la configurazione dell'ambiente di lavoro corrente.

Possiamo usare la proprietà di sistema " sun.arch.data.model " per identificare JVM bitness:

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

Contiene "32" o "64" per indicare rispettivamente una JVM a 32 o 64 bit. Sebbene questo approccio sia facile da usare, restituisce "sconosciuto" se la proprietà non è presente. Quindi, funzionerà solo con le versioni Oracle Java.

Vediamo il codice:

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

Controlliamo questo approccio attraverso uno unit test:

@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. Utilizzo dell'API JNA

JNA (Java Native Access) supporta varie piattaforme come macOS, Microsoft Windows, Solaris, GNU e Linux.

Utilizza funzioni native per caricare una libreria in base al nome e recuperare un puntatore a una funzione all'interno di quella libreria.

3.1. Classe nativa

Possiamo usare POINTER_SIZE dalla classe Native . Questa costante specifica la dimensione (in byte) di un puntatore nativo sulla piattaforma corrente.

Un valore di 4 indica un puntatore nativo a 32 bit, mentre un valore di 8 indica un puntatore nativo a 64 bit:

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

3.2. Classe piattaforma

In alternativa, possiamo usare la classe Platform , che fornisce informazioni sulla piattaforma semplificate.

Contiene il metodo is64Bit () che rileva se la JVM è a 64 bit o meno .

Vediamo come identifica il testimone:

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

Qui, la costante ARCH è derivata dalla proprietà " os.arch " tramite la classe System . Viene utilizzato per ottenere l'architettura del sistema operativo:

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

Questo approccio funziona per diversi sistemi operativi e anche con diversi fornitori di JDK. Pertanto, è più affidabile della proprietà di sistema " sun.arch.data.model ".

4. Conclusione

In questo tutorial, abbiamo imparato come controllare la versione bit di JVM. Abbiamo anche osservato come JNA ha semplificato la soluzione per noi su piattaforme diverse.

Come sempre, il codice completo è disponibile su GitHub.