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?

BobMcGee
la source
3
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:

System.getProperty("sun.arch.data.model");

Les résultats possibles sont:

  • "32" - JVM 32 bits
  • "64" - JVM 64 bits
  • "unknown" - JVM inconnue

Comme 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.

codaddict
la source
22
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.
skiphoppy
7
Cette propriété est prise en charge sur les machines virtuelles Java IBM, mais pas sur GCJ. Voir stackoverflow.com/questions/807263/…
Emmanuel Bourg
708

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.

gpampara
la source
3
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 -version et également de java -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.

Sedat Kilinc
la source
mais dans hp nonstop oss env, je n'obtiens pas 64 bits ou 32 bits
vels4j
28
OP dit spécifiquement dans le programme .
Tomáš Zato - Reinstate Monica
34

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.

Bryantsai
la source
7
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.

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. "

faible
la source
7

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

jawsnnn
la source
6

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).

Anthony Hayward
la source
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 ").

user1364368
la source
1

Si vous utilisez JNA, vous pouvez le faire Platform.is64Bit().

鹞 之 神 乐
la source
-1

Pour Windows, vous pouvez vérifier l' Javaemplacement du domicile. S'il en contient (x86)il en est 32-bitautrement 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

Pourquoi se soucier d'une Windowsseule solution?

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.

BullyWiiPlaza
la source
-2

Pour obtenir la version de JVM exécutant actuellement le programme

System.out.println(Runtime.class.getPackage().getImplementationVersion());
Olu Smith
la source
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.
BullyWiiPlaza