Comment puis-je savoir si je tourne en JVM 64 bits ou en JVM 32 bits (à partir d'un programme)?
Comment puis-je savoir si la JVM dans laquelle mon application s'exécute est de 32 bits ou de 64 bits? Plus précisément, à quelle fonction ou préférence puis-je accéder pour détecter cela dans le programme?
10 réponses
Sun a une propriété de système Java pour déterminer le bitness de la JVM: 32 ou 64:
sun.arch.data.model=32 // 32 bit JVM
sun.arch.data.model=64 // 64 bit JVM
vous pouvez utiliser
System.getProperty("sun.arch.data.model")
pour déterminer si son 32/64 du programme.
De la Soleil HotSpot FAQ :
lors de l'écriture de code Java, Comment puis-je distinguer entre 32 et 64 bits opération?
il n'y a pas D'API publique qui vous permet distinguer entre 32 et 64 bits opération. Pensez à 64 bits seulement une autre plate-forme dans l'écriture une fois, courir partout tradition. Toutefois, si vous souhaitez écrire le code qui est plate-forme spécifique (honte sur vous), la propriété du système
sun.arch.data.model
a la valeur "32", "64", ou "inconnu."
la seule bonne raison est si votre java code dépend de bibliothèques natives et votre code doit déterminer la la version (32 ou 64 bits).) à charger au démarrage.
Vous pouvez essayer sur la ligne de commande:
java -d64 -version
si ce n'est pas une version 64 bits, vous obtiendrez un message qui ressemble à:
cette instance Java ne supporte pas les JVM 64 bits. Veuillez installer la version désirée.
consultez les options d'aide de la JVM pour plus d'informations java -help
tapez juste java -version
dans votre console.
si une version 64 bits est en cours d'exécution, vous recevrez 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 montrera 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)
Note Client
au lieu de 64-Bit Server
à la troisième ligne. La partie Client/Server
n'est pas pertinente, c'est l'absence du 64-Bit
qui importe.
si plusieurs versions Java sont installées sur votre système, naviguez vers le dossier / bin de la version Java que vous voulez vérifier, et tapez java -version
là.
Mise À Jour :
j'ai installé JVM 32-bit et je l'ai récupéré à nouveau, on dirait que ce qui suit vous dit bitness JVM, pas OS arch:
System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "xmd64" when using 64-bit JVM
cela a été testé contre SUN et IBM JVM (32 et 64-bit). De toute évidence, la propriété du système n'est pas seulement l'arche du système d'exploitation.
informations complémentaires:
Sur un processus en cours vous pouvez utiliser (au moins avec les récents Soleil JDK5/6 versions):
$ /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 la jvm exécutant la demande. "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
toutefois considérer aussi cette note:
NOTE - cette utilité n'est pas pris en charge et peut ou non être disponible dans les versions futures du JDK. Dans les systèmes de fenêtres où dbgent.dll est absent,' Debugging Tools for Windows ' doit être installé pour que ces outils fonctionnent. De même, la variable D'environnement PATH devrait contenir l'emplacement de jvm.dll utilisé par le processus cible ou l'endroit à partir duquel le fichier crash Dump 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: ELF 64-bit LSB executable , AMD x86-64, version 1 (SYSV), pour GNU / Linux 2.4.0, dynamiquement lié (utilise libs partagées), pour GNU / Linux 2.4.0, Non dépouillé
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 caractéristiques "les variantes 64 bits de JRE & JDK sont listées avec" 64 bits "entre parenthèses (par exemple" Java SE Development Kit 7 Update 65 (64 bits) ", alors que pour les variantes de 32 bits la variante n'est pas mentionnée entre parenthèses (par exemple juste " Java SE Development Kit 8 Update 60 ").
pour Windows
, vous pouvez consulter le Java
lieu de résidence. Si elle contient (x86)
c'est 32-bit
sinon 64-bit
:
public static boolean is32Bit()
{
val javaHome = System.getProperty("java.home");
return javaHome.contains("(x86)");
}
public static boolean is64Bit()
{
return !is32Bit();
}
exemples de parcours:
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
Pourquoi une Windows
seule solution?
si vous avez besoin de savoir quelle version bit vous utilisez, vous êtes probablement en train de jouer avec le code natif sur Windows
donc plateforme-indépendance est hors de la fenêtre de toute façon.
pour obtenir la version de JVM exécutant actuellement le programme
System.out.println(Runtime.class.getPackage().getImplementationVersion());