Comment puis-je savoir si la JVM de mon application s'exécute en 32 bits ou en 64 bits? Plus précisément, quelle fonction ou quelle préférence dois-je accéder pour détecter cela dans le programme?Comment puis-je savoir si je cours en JVM 64 bits ou en JVM 32 bits (à partir d'un programme)?
Répondre
Sun a 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.
De l'Sun HotSpot FAQ:
When writing Java code, how do I distinguish between 32 and 64-bit operation?
There's no public API that allows you to distinguish between 32 and 64-bit operation. Think of 64-bit as just another platform in the write once, run anywhere tradition. However, if you'd like to write code which is platform specific (shame on you), the system property
sun.arch.data.model
has the value "32", "64", or "unknown".
La seule bonne raison est si votre code java dépend de bibliothèques natives et votre code doit déterminer qui la version (32 ou 64 bits) pour charger au démarrage.
Est-ce défini par la spécification Java pour fonctionner avec toutes les JVM ou est-ce spécifique à Hotspot? – BobMcGee
Je ne m'attendrais pas à trouver des propriétés système 'sun. *' Avec une machine virtuelle Java IBM. En d'autres termes, ce n'est pas portable. –
Est-ce encore valide maintenant que Java appartient à Oracle? Je cours un environnement-auditeur qui exécutera pré-déploiement de notre application. Nous devons vérifier que les boîtes de production 64 bits sont équipées de Java 64 bits car nous ne gérons pas ces machines. Je dois m'assurer que cela fonctionne encore et continuera à aller de l'avant avec Oracle. –
Mise à jour Encore une fois:
J'ai installé JVM 32 bits et réessayé encore, ressemble à ce qui suit ne vous dire bitness JVM, courbez pas OS:
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é à la fois contre SUN et IBM JVM (32 et 64 bits). Clairement, la propriété système n'est pas seulement l'arche du système d'exploitation.
Cela donne des informations sur l'architecture du système d'exploitation. Si je ne me trompe pas, cela ne doit pas nécessairement être la même chose de la JVM. – codaddict
Oui. Il donne x86, etc. Pas tout à fait la même chose, car je ne suis pas sûr si elle donne "x64" pour x86-64 en cours d'exécution en 64 bits plutôt qu'en 32 bits. – BobMcGee
@codaddict, on dirait que c'est vraiment le bit de la JVM. – bryantsai
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 à:
This Java instance does not support a 64-bit JVM. Please install the desired version.
Consulter les options d'aide de la JVM pour plus d'informations java -help
Bien que cela soit bon à savoir, ce n'est pas utile car je dois l'exécuter depuis l'extérieur du programme ou utiliser les options java pour démarrer un nouveau processus. – BobMcGee
Désolé, j'ai complètement mal lu la question. Dans Java lui-même, la manière correcte serait comme décrit par codadict – gpampara
Note: L'indicateur -d64 ne fonctionne pas sous Windows. – Eddie
Tapez simplement java -version
dans votre console.
Si une version 64 bits est en cours d'exécution, vous obtiendrez 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)
Remarque Client
au lieu de 64-Bit Server
en la troisième ligne. La partie Client/Server
n'est pas pertinente, c'est l'absence du 64-Bit
qui compte.
Si plusieurs versions Java sont installées sur votre système, accédez au dossier/bin de la version Java que vous souhaitez vérifier et tapez java -version
.
mais en hp nonstop oss env je ne reçois pas 64bit ou 32 bits – vels4j
OP dit spécifiquement ** dans le programme **. –
Informations complémentaires:
Sur un processus en cours d'exécution vous pouvez utiliser (au moins avec quelques récents Sun 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 PID de jvm exécuter l'application. "os.arch" fonctionne aussi.
également d'autres scénarios sont pris en charge:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [[email protected]]remote-hostname-or-IP
considèrent cependant également cette note.
"NOTE - Cet utilitaire est pris en charge et peut ou peut ne pas être disponible dans les prochaines versions du JDK Dans Windows Les systèmes où dbgent.dll n'est pas présent, 'Outils de débogage pour Windows' doivent être installés pour que ces outils fonctionnent.La variable d'environnement PATH doit également contenir l'emplacement de jvm.dll utilisé par le processus cible ou l'emplacement à partir duquel Crash Le fichier de vidage a été produit. "
Sur 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 bits exécutable bit de poids faible, AMD x86-64, version 1 (SYSV), pour GNU/Linux 2.4.0, liée de façon dynamique (utilise bibliothèques partagées), pour GNU/Linux 2.4.0, non dénudée
ou
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'
o/p: Classe: ELF
Si vous utilisez la 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 la rubrique « programmes | Programmes et fonctionnalités » les variantes 64 bits de JRE & JDK sont répertoriés 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 obtenir la version de machine virtuelle Java en cours d'exécution du programme
System.out.println(Runtime.class.getPackage().getImplementationVersion());
Est-ce que ce rapport concernerait la machine virtuelle Java ou le système d'exploitation? Vous pouvez exécuter une machine virtuelle Java 32 bits sur un système d'exploitation 64 bits. –
J'ai modifié la réponse. Voir la mise à jour – Olu
Cela n'utilise pas JMX? –
Juste par curiosité, pourquoi auriez-vous besoin de connaître la taille naturelle du système? Des détails comme celui-ci sont abstraits en Java, vous ne devriez donc pas (en théorie du moins) les connaître. –
Cela me permet d'estimer approximativement les besoins en mémoire pour les objets dus aux pointeurs. La curiosité aussi - semblait être un moyen, mais je n'en avais jamais entendu parler. – BobMcGee
Ce "détail" n'est pas abstrait lorsque vous interagissez avec l'interface native Java. Les DLL 32 bits ne peuvent pas être chargées avec une JVM 64 bits (et vice versa). C'est donc une information essentielle pour quiconque utilise JNI. Il est dommage qu'il semble n'y avoir aucun moyen portable d'obtenir cette information. Une façon consiste à d'abord essayer de charger une version 32 bits de la DLL, et si elle échoue, essayez la version 64 bits, etc Ugly! –