web-dev-qa-db-fra.com

Comment savoir si je suis en cours d'exécution sur une machine virtuelle Java 64 bits ou 32 bits (à partir d'un programme)?

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?

533
BobMcGee

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.

305
codaddict

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

658
gpampara

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.

176
Sedat Kilinc

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.

33
bryantsai

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

13
dim

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

6
Anthony Hayward

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

6
jawsnnn

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

1
user1364368

Si vous utilisez la JNA, vous pouvez faire ceciPlatform.is64Bit().

0
鹞之神乐

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

Pourquoi se préoccuper d’une solution 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.

0
BullyWiiPlaza