Vérifier si un programme Java s'exécute dans une JVM 64 bits ou 32 bits

1. Vue d'ensemble

Bien que Java soit indépendant de la plate-forme, nous devons parfois utiliser des bibliothèques natives. Dans ces cas, nous pouvons avoir besoin d'identifier la plate-forme sous-jacente et de charger les bibliothèques natives appropriées au démarrage.

Dans ce didacticiel, nous allons apprendre différentes façons de vérifier si un programme Java s'exécute sur une JVM 64 bits ou 32 bits.

Tout d'abord, nous montrerons comment y parvenir en utilisant la classe System .

Ensuite, nous verrons comment utiliser l'API Java Native Access (JNA) pour vérifier le bitness de la JVM. JNA est une bibliothèque développée par la communauté qui permet tous les accès natifs.

2. Utilisation de la propriété système sun.arch.data.model

La classe System en Java permet d'accéder aux propriétés et aux variables d'environnement définies en externe. Il gère un objet Properties qui décrit la configuration de l'environnement de travail actuel.

Nous pouvons utiliser la propriété système « sun.arch.data.model » pour identifier le bitness JVM:

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

Il contient «32» ou «64» pour indiquer respectivement une JVM 32 bits ou 64 bits. Bien que cette approche soit facile à utiliser, elle renvoie «inconnu» si la propriété n'est pas présente. Par conséquent, cela ne fonctionnera qu'avec les versions Oracle Java.

Voyons le code:

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

Vérifions cette approche à travers un test unitaire:

@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. Utilisation de l'API JNA

JNA (Java Native Access) prend en charge diverses plates-formes telles que macOS, Microsoft Windows, Solaris, GNU et Linux.

Il utilise des fonctions natives pour charger une bibliothèque par nom et récupérer un pointeur vers une fonction dans cette bibliothèque.

3.1. Classe autochtone

Nous pouvons utiliser POINTER_SIZE de la classe Native . Cette constante spécifie la taille (en octets) d'un pointeur natif sur la plate-forme actuelle.

Une valeur de 4 indique un pointeur natif 32 bits, tandis qu'une valeur de 8 indique un pointeur natif 64 bits:

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

3.2. Classe de plateforme

Alternativement, nous pouvons utiliser la classe Platform , qui fournit des informations simplifiées sur la plateforme.

Il contient la méthode is64Bit () qui détecte si la JVM est 64 bits ou non .

Voyons comment il identifie le bitness:

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

Ici, la constante ARCH est dérivée de la propriété « os.arch » via la classe System . Il est utilisé pour obtenir l'architecture du système d'exploitation:

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

Cette approche fonctionne pour différents systèmes d'exploitation et également avec différents fournisseurs de JDK. Par conséquent, elle est plus fiable que la propriété système « sun.arch.data.model ».

4. Conclusion

Dans ce didacticiel, nous avons appris à vérifier la version du bit JVM. Nous avons également observé comment JNA a simplifié la solution pour nous sur différentes plateformes.

Comme toujours, le code complet est disponible à l'adresse over sur GitHub.