2010-01-14 10 views
484

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

+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 en Java, vous ne devriez donc pas (en théorie du moins) les connaître. –

+3

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

+74

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! –

Répondre

290

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.

+0

Est-ce défini par la spécification Java pour fonctionner avec toutes les JVM ou est-ce spécifique à Hotspot? – BobMcGee

+18

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

+1

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

29

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.

+7

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

+0

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

+2

@codaddict, on dirait que c'est vraiment le bit de la JVM. – bryantsai

596

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

+2

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

+1

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

+3

Note: L'indicateur -d64 ne fonctionne pas sous Windows. – Eddie

153

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.

+0

mais en hp nonstop oss env je ne reçois pas 64bit ou 32 bits – vels4j

+16

OP dit spécifiquement ** dans le programme **. –

11

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

5

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

3

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

2

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

1

Pour obtenir la version de machine virtuelle Java en cours d'exécution du programme

System.out.println(Runtime.class.getPackage().getImplementationVersion()); 
+0

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

+0

J'ai modifié la réponse. Voir la mise à jour – Olu

+0

Cela n'utilise pas JMX? –