Wie kann ich feststellen, ob die JVM, in der meine Anwendung ausgeführt wird, 32-Bit oder 64-Bit ist? Welche Funktionen oder Eigenschaften kann ich verwenden, um dies im Programm zu erkennen?
Wie kann ich feststellen, ob die JVM, in der meine Anwendung ausgeführt wird, 32-Bit oder 64-Bit ist? Welche Funktionen oder Eigenschaften kann ich verwenden, um dies im Programm zu erkennen?
Antworten:
Sie rufen die Systemeigenschaft ab , die die Bitigkeit dieser JVM kennzeichnet mit:
System.getProperty("sun.arch.data.model");
Mögliche Ergebnisse sind:
"32"
- 32-Bit-JVM"64"
- 64-Bit-JVM"unknown"
- Unbekannte JVMWie in den HotSpot-FAQ beschrieben :
Wie unterscheide ich beim Schreiben von Java-Code zwischen 32- und 64-Bit-Betrieb?
Es gibt keine öffentliche API, mit der Sie zwischen 32- und 64-Bit-Betrieb unterscheiden können. Stellen Sie sich 64-Bit als eine weitere Plattform vor, die einmal geschrieben wurde und überall Tradition hat. Wenn Sie jedoch plattformspezifischen Code schreiben möchten (Schande über Sie), hat die Systemeigenschaft sun.arch.data.model den Wert "32", "64" oder "unbekannt".
Ein Beispiel, bei dem dies erforderlich sein könnte, ist, wenn Ihr Java-Code von nativen Bibliotheken abhängt und Sie bestimmen müssen, ob die 32- oder 64-Bit-Version der Bibliotheken beim Start geladen werden soll.
sun.*
Systemeigenschaften mit einer IBM JVM zu finden. Mit anderen Worten, es ist nicht tragbar.
Für bestimmte Java-Versionen können Sie die Bitigkeit der JVM über die Befehlszeile mit den Flags -d32
und überprüfen -d64
.
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
Führen Sie Folgendes aus, um nach einer 64-Bit-JVM zu suchen:
$ java -d64 -version
Wenn es sich nicht um eine 64-Bit-JVM handelt, erhalten Sie Folgendes:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
Führen Sie folgende Schritte aus, um nach einer 32-Bit-JVM zu suchen:
$ java -d32 -version
Wenn es sich nicht um eine 32-Bit-JVM handelt, erhalten Sie Folgendes:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
Diese Fahnen wurden in Java 7, hinzugefügt veraltete in Java 9, entfernt in Java 10 und nicht mehr auf moderne Versionen von Java.
java -d32 -version
, um zu überprüfen, ob Sie kein 32-Bit ausführen . Beide wünschen weiter zu arbeiten Win7
.
java -d32 -version
und auch von java -d64 -version
.
Geben java -version
Sie einfach Ihre Konsole ein.
Wenn eine 64-Bit-Version ausgeführt wird, wird folgende Meldung angezeigt:
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 etwas Ähnliches wie:
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
statt 64-Bit Server
in der dritten Zeile. Der Client/Server
Teil ist irrelevant, es ist das Fehlen des 64-Bit
Entscheidenden.
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 java -version
dort ein.
Ich habe 32-Bit-JVM installiert und es erneut versucht. Es sieht so aus, als ob das Folgende Ihnen die JVM-Bitness sagt, nicht den Betriebssystembogen:
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 gegen SUN als auch gegen IBM JVM (32 und 64-Bit) getestet. Es ist klar, dass die Systemeigenschaft nicht nur der Betriebssystembogen ist.
os.arch
hat viele mögliche Werte, es ist schwer zu sagen, ob es 32 oder 64 Bit ist. Siehe lopica.sourceforge.net/os.html
Ergänzende Informationen:
Bei einem laufenden Prozess können Sie Folgendes verwenden (zumindest bei einigen neueren Sun JDK5 / 6-Versionen):
$ /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.
Es werden auch andere Szenarien unterstützt:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
Beachten Sie jedoch auch diesen Hinweis:
" HINWEIS - Dieses Dienstprogramm wird nicht unterstützt und ist möglicherweise in zukünftigen Versionen des JDK verfügbar oder nicht. In Windows-Systemen, in denen dbgent.dll nicht vorhanden ist, muss 'Debugging Tools for Windows' installiert werden, damit diese Tools funktionieren Die Umgebungsvariable PATH sollte den Speicherort von jvm.dll enthalten, der vom Zielprozess verwendet wird, oder den Speicherort, von dem aus die Crash-Dump-Datei erstellt wurde. "
Unter Linux können Sie ELF-Header-Informationen mit einem der beiden folgenden Befehle abrufen:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o / p: Ausführbare ELF 64-Bit-LSB-Datei , 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: ELF 64
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).
Unter Windows 7 werden in der " Systemsteuerung " unter " Programme | Programme und Funktionen " die 64-Bit-Varianten von JRE & JDK mit " 64-Bit " in Klammern aufgeführt (z. B. " Java SE Development Kit 7 Update 65 (64-Bit") ) "), während für die 32-Bit-Varianten die Variante nicht in Klammern angegeben ist (zB nur" Java SE Development Kit 8 Update 60 ").
Für Windows
können Sie den Java
Heimatort überprüfen . Wenn es enthält (x86)
, ist es 32-bit
anders 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
Windows
einzige Lösung kümmern ?Wenn Sie wissen müssen, auf welcher Bit-Version Sie ausgeführt werden, spielen Sie wahrscheinlich mit nativem Code herum, Windows
sodass die Plattformunabhängigkeit ohnehin nicht im Fenster steht.
Um die Version von JVM zu erhalten, auf der das Programm gerade ausgeführt wird
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
oder null
weiter zurück Java 10
und beantwortet die Frage sowieso nicht.