it-swarm.com.de

Wie kann ich feststellen, ob ich 64-Bit-JVM oder 32-Bit-JVM (von einem Programm aus) verwende?

Wie kann ich feststellen, ob die JVM, in der meine Anwendung ausgeführt wird, 32 Bit oder 64 Bit ist? Welche Funktion oder Einstellung greife ich speziell, um dies innerhalb des Programms zu erkennen?

533
BobMcGee

Sun verfügt über eine Java-System-Eigenschaft, um die Bittigkeit der JVM zu bestimmen: 32 oder 64

Sun.Arch.data.model=32 // 32 bit JVM
Sun.Arch.data.model=64 // 64 bit JVM

Sie können verwenden

System.getProperty("Sun.Arch.data.model") 

um zu bestimmen, ob es 32/64 aus dem Programm.

Aus dem Sun HotSpot FAQ :

Wie schreibe ich Java-Code? unterscheiden zwischen 32 und 64-Bit Operation?

Es gibt keine öffentliche API, mit der Sie zur Unterscheidung zwischen 32 und 64 Bit Operation. Stellen Sie sich 64-Bit nur als .__ vor. einmal eine andere Plattform, Überall laufen Tradition. Jedoch, wenn Sie möchten Code schreiben, der .__ ist. plattformspezifisch (schämen Sie sich), die Systemeigenschaft Sun.Arch.data.model hat den Wert "32", "64" oder "unbekannte".

Der einzige gute Grund ist, wenn Ihr Java Code ist abhängig von nativen Bibliotheken und Ihr Code muss bestimmen, welche Version (32 oder 64bit) beim Start laden.

305
codaddict

Sie können es in der Befehlszeile versuchen:

Java -d64 -version

Wenn es sich nicht um eine 64-Bit-Version handelt, erhalten Sie eine Meldung, die wie folgt aussieht:

Diese Java-Instanz unterstützt keine 64-Bit-JVM . Bitte installieren Sie die gewünschte Version.

Konsultieren Sie die Hilfeoptionen der JVM, um weitere Informationen zu erhalten. Java -help

658
gpampara

Geben Sie einfach Java -version in Ihre Konsole ein.

Wenn eine 64-Bit-Version ausgeführt wird, erhalten Sie eine Meldung wie:

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)

Eine 32-Bit-Version zeigt Folgendes:

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)

Beachten Sie Client anstelle von 64-Bit Server in der dritten Zeile. Der Client/Server-Teil ist irrelevant, es ist das Fehlen des 64-Bit, der zählt.

Wenn auf Ihrem System mehrere Java-Versionen installiert sind, navigieren Sie zum Ordner/bin der Java-Version, die Sie überprüfen möchten, und geben Sie dort Java -version ein.

176
Sedat Kilinc

Erneut aktualisieren :

Ich habe die 32-Bit-JVM installiert und erneut versucht, es sieht so aus, als würden Sie über die JVM-Bitness sagen, nicht über OS Arch:

System.getProperty("os.Arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "AMD64" when using 64-bit JVM

Dies wurde sowohl mit Sun als auch mit IBM JVM (32 und 64 Bit) getestet. Natürlich ist die Systemeigenschaft nicht nur das Betriebssystem Arch.

33
bryantsai

Ergänzende Infos:

Auf einem laufenden Prozess können Sie (zumindest in einigen neueren Sun JDK5/6-Versionen) Folgendes verwenden:

$ /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

dabei ist 14680 die PID von Jvm, auf dem die Anwendung ausgeführt wird. "os.Arch" funktioniert auch.

Auch andere Szenarien werden unterstützt:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [[email protected]]remote-hostname-or-IP 

Beachten Sie jedoch auch diesen Hinweis:

" NOTE - Dieses Dienstprogramm wird nicht unterstützt und ist möglicherweise in zukünftigen Versionen des JDK verfügbar. In Windows-Systemen, auf denen dbgent.dll nicht vorhanden ist, muss 'Debugging Tools for Windows' installiert sein Diese Tools funktionieren. Außerdem sollte die Umgebungsvariable PATH den vom Zielprozess verwendeten Speicherort von jvm.dll oder den Speicherort enthalten, von dem aus die Crash-Dump-Datei erstellt wurde. "

13
dim

Wenn Sie JNA verwenden, können Sie prüfen, ob com.Sun.jna.Native.POINTER_SIZE == 4 (32 Bit) oder com.Sun.jna.Native.POINTER_SIZE == 8 (64 Bit) ist.

6
Anthony Hayward

Unter Linux können Sie ELF-Headerinformationen abrufen, indem Sie einen der folgenden zwei Befehle verwenden:

file {YOUR_JRE_LOCATION_HERE}/bin/Java

o/p: ELF 64-Bit-LSB-Programm, AMD x86-64, Version 1 (SYSV), für GNU/Linux 2.4.0, dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU/Linux 2.4.0, nicht entfernt

oder

readelf -h {YOUR_JRE_LOCATION_HERE}/bin/Java | grep 'Class'

o/p: Klasse: ELF64

6
jawsnnn

Unter Windows 7 in der " Systemsteuerung " unter " Programme | Programme und Funktionen " sind die 64-Bit-Varianten von JRE & JDK mit " 64-Bit " in Klammern aufgeführt (z " Java SE Development Kit 7 Update 65 (64-Bit) "), während die Variante für die 32-Bit-Variante nicht in Klammern angegeben ist (zB nur " Java SE Development Kit 8 Update 60 " ). 

1
user1364368

Wenn Sie JNA verwenden, können Sie diesPlatform.is64Bit() tun.

0
鹞之神乐

Für Windows können Sie den Heimatort Java überprüfen. Wenn es (x86) enthält, ist es 32-bit, sonst 64-bit:

public static boolean is32Bit()
{
    val javaHome = System.getProperty("Java.home");
    return javaHome.contains("(x86)");
}

public static boolean is64Bit()
{
    return !is32Bit();
}

Beispielpfade:

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

Warum sollte man sich nur für eine Windows-Lösung interessieren?

Wenn Sie wissen möchten, mit welcher Bit-Version Sie arbeiten, fälschen Sie wahrscheinlich mit nativem Code in Windows, so dass Plattformunabhängigkeit sowieso aus dem Fenster ist.

0
BullyWiiPlaza