Comment savoir si la machine virtuelle Java sur laquelle mon application s'exécute est 32 bits ou 64 bits? Plus précisément, à quelle fonction ou préférence dois-je accéder pour détecter cela dans le programme?
Sun dispose d'une propriété Java System pour déterminer le nombre de bits de la machine virtuelle Java: 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.
Depuis le Sun HotSpot FAQ :
Quand j'écris du code Java, comment puis-je distinguer entre 32 et 64 bits opération?
Aucune API publique ne vous autorise faire la distinction entre 32 et 64 bits opération. Pensez à 64 bits comme juste une autre plate-forme dans l'écriture une fois, courir n'importe où la tradition. Toutefois, si vous souhaitez écrire du code qui est Plate-forme spécifique (honte à vous), le propriété système
Sun.Arch.data.model
a la valeur "32", "64" ou "inconnu".
La seule bonne raison est si votre Java le code dépend des bibliothèques natives et votre code doit déterminer lequel version (32 ou 64 bits) à charger au démarrage.
Vous pouvez essayer sur la ligne de commande:
Java -d64 -version
S'il ne s'agit pas d'une version 64 bits, vous recevrez un message ressemblant à ceci:
Cette instance Java ne prend pas en charge une JVM 64 bits . S'il vous plaît installer la version souhaitée.
Consultez les options d'aide de la machine virtuelle Java pour plus d'informations. Java -help
Il suffit de taper Java -version
dans votre console.
Si une version 64 bits est en cours d'exécution, vous recevrez un message du type:
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)
Notez Client
au lieu de 64-Bit Server
dans la troisième ligne. La partie Client/Server
est sans importance, 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 entrez Java -version
à cet emplacement.
Update Again :
J'ai installé la machine virtuelle Java 32 bits et l'ai réessayé à nouveau. Il semble que ce qui suit indique le bitness de la machine virtuelle Java, pas OS Arch:
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). Clairement, la propriété du système n'est pas simplement le système d'exploitation Arch.
Informations complémentaires:
Sur un processus en cours d'exécution, vous pouvez utiliser (du 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
Cependant, considérez aussi cette note:
" NOTE - Cet utilitaire n'est pas pris en charge et peut ne pas être disponible dans les versions futures du JDK. Dans les systèmes Windows où dbgent.dll n'est pas présent, 'Outils de débogage pour Windows' doit être installé Ces variables fonctionnent également. La variable d’environnement PATH doit également contenir l’emplacement de jvm.dll utilisé par le processus cible ou l’emplacement à partir duquel le fichier de vidage sur incident a été généré. "
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 Linux, vous pouvez obtenir des informations sur l'en-tête ELF à l'aide de l'une des deux commandes suivantes:
file {YOUR_JRE_LOCATION_HERE}/bin/Java
o/p: ELF Exécutable LSB 64 bits, AMD x86-64, version 1 (SYSV), pour GNU/Linux 2.4.0, liée dynamiquement (utilise des bibliothèques partagées), pour GNU/Linux 2.4.0, non supprimée
ou
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/Java | grep 'Class'
o/p: Classe: ELF64
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 mise à jour 65 (64 bits) "), tandis que pour les variantes 32 bits, la variante n'est pas mentionnée entre parenthèses (par exemple, juste " Java SE Development Kit 8 mise à jour 60 " ).
Si vous utilisez la JNA, vous pouvez faire ceciPlatform.is64Bit()
.
Pour Windows
, vous pouvez vérifier le lieu de résidence Java
. S'il 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 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
seulement?Si vous avez besoin de savoir quelle version de bit vous utilisez, vous êtes probablement en train de bidouiller avec du code natif sur Windows
afin que l'indépendance de la plate-forme soit de toute façon hors de portée.