Comment savoir si j'exécute en JVM 64 bits ou JVM 32 bits (à partir d'un programme)?
563
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?
Juste par curiosité, pourquoi auriez-vous besoin de connaître la taille naturelle du système? Des détails comme celui-ci sont abstraits dans Java, vous ne devriez donc pas (en théorie, au moins) les connaître.
Patrick Niedzielski
3
Cela me permet d'estimer approximativement les besoins en mémoire des objets en raison des pointeurs. Curiosité aussi - il semblait qu'il devait y avoir un moyen, mais je n'en avais jamais entendu parler.
BobMcGee
85
Ce "détail" n'est pas résumé lors de l'interaction avec l'interface native Java. Les DLL 32 bits ne peuvent pas être chargées avec une machine virtuelle Java 64 bits (et vice versa). Il s'agit donc d'informations très essentielles pour quiconque utilise JNI. Dommage qu'il ne semble pas y avoir de moyen portable d'obtenir ces informations. Une façon consiste à essayer d'abord de charger une version 32 bits de la DLL, et si elle échoue, essayez la version 64 bits, etc. Laid!
Joonas Pulakka
12
Une autre situation où le discernement entre les machines virtuelles Java 32 ou 64 bits est important est pour les fichiers mappés. Sur les systèmes 32 bits, seuls 2 Go peuvent être mappés, il est donc important de mapper et de démapper les segments de fichiers en conséquence afin que cette limite ne soit pas dépassée, tandis que sur jvms 64 bits, la limite est beaucoup, beaucoup, beaucoup plus élevée.
Simone Gianni
2
C'est vraiment sympa de pouvoir choisir l'algorithme numérique qui sera le plus rapide sur la machine en question.
dfeuer
Réponses:
317
Vous récupérez la propriété système qui marque le bitness de cette machine virtuelle Java avec:
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.
Je ne m'attendrais pas à trouver des sun.*propriétés système avec une machine virtuelle Java IBM. En d'autres termes, ce n'est pas portable.
Pascal Thivent
8
Comment pouvez-vous dire à partir de la ligne de commande? Si vous utilisez 32 bits ou 64 bits? Juste curieux.
Xonatron
17
Pourquoi la réponse acceptée dépend-elle du soleil? "os.arch" accomplira la même chose sans avoir à utiliser des packages sun propriétaires.
b1nary.atr0phy
7
@ b1naryatr0phy, os.arch fait-il rapport sur le système d'exploitation ou la JVM? J'exécute souvent la JVM 32 bits sur ma station de travail 64 bits, à des fins de développement.
Pour certaines versions de Java, vous pouvez vérifier le bitness de la JVM à partir de la ligne de commande avec les drapeaux -d32et -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.
Bien que cela soit bon à savoir, ce n'est pas utile car je dois l'exécuter à l'extérieur du programme ou utiliser des options java pour démarrer un nouveau processus.
BobMcGee
13
Exactement ce que je cherchais. Et vous pouvez exécuter java -d32 -versionpour vérifier que vous n'exécutez pas 32 bits. Les deux souhaitent travailler Win7.
Xonatron
31
Je suis sous Windows 7 et j'obtiens l'erreur «option non reconnue» de java -d32 -versionet également dejava -d64 -version .
le
40
N'utilisez pas "-D64", car cela fait quelque chose de complètement différent. Il définit une propriété système appelée "64". Ce n'est certainement pas ce que l'on souhaite ici.
Jonathan Headland du
9
Les drapeaux -d32 ou -d64 ne fonctionneront que pour Java 7 ou supérieur.
darrenmc
188
Tapez simplement java -versionvotre 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 Clientau lieu de 64-Bit Serverdans la troisième ligne. La Client/Serverpartie est hors de propos, c'est l'absence du 64-Bitqui 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.
Cela donne des informations sur l'architecture du système d'exploitation. Si je ne me trompe pas, ce n'est pas nécessairement le cas de JVM bitness.
codaddict
2
@codaddict, on dirait qu'il s'agit bien d'un témoin JVM.
bryantsai
20
@codaddict C'est complètement faux (et je n'ai aucune idée pourquoi six personnes ont voté pour ce commentaire.) "os.arch" est conçu pour renvoyer la version JVM. Testez-le par vous-même et Dieu vous aide si vous vous en remettez à la détection du système d'exploitation.
b1nary.atr0phy
6
os.archa de nombreuses valeurs possibles, il est difficile de dire si c'est 32 ou 64 bits. Voir lopica.sourceforge.net/os.html
Emmanuel Bourg
2
Il s'agit d'une chaîne destinée aux yeux humains et sans définition stricte de valeurs valides, il n'est pas judicieux de s'y fier - écrivez du code qui vérifie la fonctionnalité réelle à la place.
Thorbjørn Ravn Andersen
15
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.
" 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é
C'est intelligent mais accéder à la taille du pointeur est beaucoup plus lent que les autres solutions ici (il faut un certain temps pour l'initialiser).
BullyWiiPlaza
1
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 ").
Si vous avez besoin de savoir sur quelle version de bit vous exécutez, vous vous amusez probablement avec du code natif Windowsafin que l'indépendance de la plate-forme soit de toute façon hors de la fenêtre.
Serait-ce un rapport pour la JVM ou le système d'exploitation? Vous pouvez exécuter une machine virtuelle Java 32 bits sur un système d'exploitation 64 bits.
Thorbjørn Ravn Andersen
Cela n'utilise pas JMX?
Thorbjørn Ravn Andersen
2
Cela renvoie quelque chose comme 1.8.0_172ou nullsur Java 10et ne répond pas de toute façon à la question.
Réponses:
Vous récupérez la propriété système qui marque le bitness de cette machine virtuelle Java avec:
Les résultats possibles sont:
"32"
- JVM 32 bits"64"
- JVM 64 bits"unknown"
- JVM inconnueComme décrit dans la FAQ HotSpot :
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.
la source
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
.Pour rechercher une JVM 64 bits, exécutez:
Si ce n'est pas une JVM 64 bits, vous obtiendrez ceci:
De même, pour rechercher une machine virtuelle Java 32 bits, exécutez:
Si ce n'est pas une JVM 32 bits, vous obtiendrez ceci:
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.
la source
java -d32 -version
pour vérifier que vous n'exécutez pas 32 bits. Les deux souhaitent travaillerWin7
.java -d32 -version
et également dejava -d64 -version
.Tapez simplement
java -version
votre console.Si une version 64 bits est en cours d'exécution, vous obtiendrez un message comme:
Une version 32 bits affichera quelque chose de similaire à:
Notez
Client
au lieu de64-Bit Server
dans la troisième ligne. LaClient/Server
partie est hors de propos, c'est l'absence du64-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.la source
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:
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.
la source
os.arch
a de nombreuses valeurs possibles, il est difficile de dire si c'est 32 ou 64 bits. Voir lopica.sourceforge.net/os.htmlInformation complémentaire:
Sur un processus en cours, vous pouvez utiliser (au moins avec certaines versions récentes de Sun JDK5 / 6):
où 14680 est le PID de jvm exécutant l'application. "os.arch" fonctionne aussi.
D'autres scénarios sont également pris en charge:
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. "
la source
Sous Linux, vous pouvez obtenir des informations d'en-tête ELF en utilisant l'une des deux commandes suivantes:
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
o / p: Classe: ELF 64
la source
Si vous utilisez JNA, vous pouvez vérifier si
com.sun.jna.Native.POINTER_SIZE == 4
(32 bits) oucom.sun.jna.Native.POINTER_SIZE == 8
(64 bits).la source
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 ").
la source
Si vous utilisez JNA, vous pouvez le faire
Platform.is64Bit()
.la source
Pour
Windows
, vous pouvez vérifier l'Java
emplacement du domicile. S'il en contient(x86)
il en est32-bit
autrement64-bit
:Exemples de chemins:
Pourquoi se soucier d'une
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.la source
Pour obtenir la version de JVM exécutant actuellement le programme
la source
1.8.0_172
ounull
surJava 10
et ne répond pas de toute façon à la question.