Comment savoir si la machine virtuelle Java dans laquelle mon application s'exécute est 32 bits ou 64 bits? Plus précisément, quelles fonctions ou propriétés puis-je utiliser pour détecter cela dans le programme?
Comment savoir si la machine virtuelle Java dans laquelle mon application s'exécute est 32 bits ou 64 bits? Plus précisément, quelles fonctions ou propriétés puis-je utiliser pour détecter cela dans le programme?
Réponses:
Vous récupérez la propriété système qui marque le bitness de cette machine virtuelle Java avec:
System.getProperty("sun.arch.data.model");
Les résultats possibles sont:
"32"
- JVM 32 bits"64"
- JVM 64 bits"unknown"
- JVM inconnueComme décrit dans la FAQ HotSpot :
Lors de l'écriture de code Java, comment distinguer le fonctionnement 32 et 64 bits?
Il n'y a pas d'API publique qui vous permette de distinguer le fonctionnement 32 et 64 bits. Considérez le 64 bits comme une simple plate-forme en écriture unique, exécutez n'importe où. Cependant, si vous souhaitez écrire du code spécifique à la plate-forme (dommage pour vous), la propriété système sun.arch.data.model a la valeur "32", "64" ou "inconnu".
Un exemple où cela pourrait être nécessaire est si votre code Java dépend de bibliothèques natives et que vous devez déterminer s'il faut charger la version 32 ou 64 bits des bibliothèques au démarrage.
sun.*
propriétés système avec une machine virtuelle Java IBM. En d'autres termes, ce n'est pas portable.
Pour certaines versions de Java, vous pouvez vérifier le bitness de la JVM à partir de la ligne de commande avec les drapeaux -d32
et -d64
.
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
Pour rechercher une JVM 64 bits, exécutez:
$ java -d64 -version
Si ce n'est pas une JVM 64 bits, vous obtiendrez ceci:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
De même, pour rechercher une machine virtuelle Java 32 bits, exécutez:
$ java -d32 -version
Si ce n'est pas une JVM 32 bits, vous obtiendrez ceci:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
Ces indicateurs ont été ajoutés dans Java 7, obsolètes dans Java 9, supprimés dans Java 10 et ne sont plus disponibles sur les versions modernes de Java.
java -d32 -version
pour vérifier que vous n'exécutez pas 32 bits. Les deux souhaitent travailler Win7
.
java -d32 -version
et également de java -d64 -version
.
Tapez simplement java -version
votre console.
Si une version 64 bits est en cours d'exécution, vous obtiendrez un message comme:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
Une version 32 bits affichera quelque chose de similaire à:
java version "1.6.0_41"
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)
Notez Client
au lieu de 64-Bit Server
dans la troisième ligne. La Client/Server
partie est hors de propos, c'est l'absence du 64-Bit
qui compte.
Si plusieurs versions de Java sont installées sur votre système, accédez au dossier / bin de la version de Java que vous souhaitez vérifier et tapez java -version
-le.
J'ai installé la JVM 32 bits et je l'ai réessayée, on dirait que ce qui suit vous indique le témoin JVM, pas l'arc du système d'exploitation:
System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM
Cela a été testé contre SUN et IBM JVM (32 et 64 bits). De toute évidence, la propriété système n'est pas seulement l'arc du système d'exploitation.
os.arch
a de nombreuses valeurs possibles, il est difficile de dire si c'est 32 ou 64 bits. Voir lopica.sourceforge.net/os.html
Information complémentaire:
Sur un processus en cours, vous pouvez utiliser (au moins avec certaines versions récentes de Sun JDK5 / 6):
$ /opt/java1.5/bin/jinfo -sysprops 14680 | grep sun.arch.data.model
Attaching to process ID 14680, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_16-b02
sun.arch.data.model = 32
où 14680 est le PID de jvm exécutant l'application. "os.arch" fonctionne aussi.
D'autres scénarios sont également pris en charge:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
Considérez cependant également cette note:
" REMARQUE - Cet utilitaire n'est pas pris en charge et peut être ou ne pas être disponible dans les futures versions du JDK. Dans les systèmes Windows où dbgent.dll n'est pas présent," Debugging Tools for Windows "doit être installé pour que ces outils fonctionnent. La variable d'environnement PATH doit contenir l'emplacement de jvm.dll utilisé par le processus cible ou l'emplacement à partir duquel le fichier de vidage sur incident a été produit. "
Sous Linux, vous pouvez obtenir des informations d'en-tête ELF en utilisant l'une des deux commandes suivantes:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o / p: exécutable ELF 64 bits LSB , AMD x86-64, version 1 (SYSV), pour GNU / Linux 2.4.0, lié dynamiquement (utilise des bibliothèques partagées), pour GNU / Linux 2.4.0, non supprimé
ou
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'
o / p: Classe: ELF 64
Si vous utilisez JNA, vous pouvez vérifier si com.sun.jna.Native.POINTER_SIZE == 4
(32 bits) ou com.sun.jna.Native.POINTER_SIZE == 8
(64 bits).
Sous Windows 7 dans le " Panneau de configuration " sous " Programmes | Programmes et fonctionnalités ", les variantes 64 bits de JRE & JDK sont répertoriées avec " 64 bits " entre parenthèses (par exemple " Java SE Development Kit 7 Update 65 (64 bits). ) "), tandis que pour les variantes 32 bits, la variante n'est pas mentionnée entre parenthèses (par exemple," Java SE Development Kit 8 Update 60 ").
Pour Windows
, vous pouvez vérifier l' Java
emplacement du domicile. S'il en contient (x86)
il en est 32-bit
autrement 64-bit
:
public static boolean is32Bit()
{
val javaHome = System.getProperty("java.home");
return javaHome.contains("(x86)");
}
public static boolean is64Bit()
{
return !is32Bit();
}
Exemples de chemins:
C:\Program Files (x86)\Java\jdk1.8.0_181\bin\java.exe # 32-bit
C:\Program Files\Java\jdk-10.0.2\bin\java.exe # 64-bit
Windows
seule solution?Si vous avez besoin de savoir sur quelle version de bit vous exécutez, vous vous amusez probablement avec du code natif Windows
afin que l'indépendance de la plate-forme soit de toute façon hors de la fenêtre.
Pour obtenir la version de JVM exécutant actuellement le programme
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
ou null
sur Java 10
et ne répond pas de toute façon à la question.