Wie kann ich feststellen, ob ich in einer 64-Bit-JVM oder einer 32-Bit-JVM (innerhalb eines Programms) ausgeführt werde?
563
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?
Warum sollten Sie aus Neugier die natürliche Größe des Systems kennen müssen? Details wie diese werden in Java abstrahiert, sodass Sie sie (zumindest theoretisch) nicht kennen müssen.
Patrick Niedzielski
3
Damit kann ich den Speicherbedarf für Objekte aufgrund von Zeigern grob abschätzen. Neugierde auch - schien, als sollte es einen Weg geben, aber ich hatte noch nie davon gehört.
BobMcGee
85
Dieses "Detail" wird bei der Interaktion mit der Java Native Interface nicht entfernt. 32-Bit-DLLs können nicht mit einer 64-Bit-JVM geladen werden (und umgekehrt). Dies sind also wichtige Informationen für jeden, der JNI verwendet. Es ist schade, dass es anscheinend keinen tragbaren Weg gibt, um diese Informationen zu erhalten. Eine Möglichkeit besteht darin, zuerst eine 32-Bit-Version der DLL zu laden. Wenn dies fehlschlägt, versuchen Sie es mit der 64-Bit-Version usw. Hässlich!
Joonas Pulakka
12
Eine andere Situation, in der das Erkennen von 32- oder 64-Bit-JVMs wichtig ist, betrifft zugeordnete Dateien. Auf 32-Bit-Systemen können nur 2 GB zugeordnet werden. Daher ist es wichtig, Dateisegmente entsprechend zuzuordnen und zu entfernen, damit dieses Limit nicht überschritten wird, während auf 64-Bit-JVMS das Limit viel, viel, viel höher ist.
Simone Gianni
2
Es ist wirklich schön, den numerischen Algorithmus auswählen zu können, der auf der betreffenden Maschine am schnellsten ist.
dfeuer
Antworten:
317
Sie rufen die Systemeigenschaft ab , die die Bitigkeit dieser JVM kennzeichnet mit:
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.
Ich würde nicht erwarten, sun.*Systemeigenschaften mit einer IBM JVM zu finden. Mit anderen Worten, es ist nicht tragbar.
Pascal Thivent
8
Wie können Sie anhand der Befehlszeile erkennen? Wenn Sie 32-Bit oder 64-Bit ausführen? Nur neugierig.
Xonatron
17
Warum ist die akzeptierte Antwort sonnenabhängig? "os.arch" erreicht das Gleiche, ohne proprietäre Sun-Pakete verwenden zu müssen.
b1nary.atr0phy
7
@ b1naryatr0phy, berichtet os.arch über das Betriebssystem oder die JVM? Zu Entwicklungszwecken führe ich häufig 32-Bit-JVM auf meiner 64-Bit-Workstation aus.
Obwohl dies gut zu wissen ist, ist es nicht nützlich, da ich es von außerhalb des Programms ausführen oder Java-Optionen verwenden muss, um einen neuen Prozess zu starten.
BobMcGee
13
Genau das, wonach ich gesucht habe. Und Sie können ausführen java -d32 -version, um zu überprüfen, ob Sie kein 32-Bit ausführen . Beide wünschen weiter zu arbeiten Win7.
Xonatron
31
Ich bin unter Windows 7 und erhalte den Fehler "Nicht erkannte Option" von java -d32 -versionund auch vonjava -d64 -version .
Ely
40
Verwenden Sie nicht "-D64", da dies etwas völlig anderes bewirkt. Es definiert eine Systemeigenschaft namens "64". Dies ist definitiv nicht das, was hier gewünscht wird.
Jonathan Headland
9
Die Flags -d32 oder -d64 funktionieren nur für Java 7 oder höher.
Darrenmc
188
Geben java -versionSie 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 Clientstatt 64-Bit Serverin der dritten Zeile. Der Client/ServerTeil ist irrelevant, es ist das Fehlen des 64-BitEntscheidenden.
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 -versiondort ein.
aber in hp nonstop oss env bekomme ich keine 64bit oder 32 bit
vels4j
28
OP sagt ausdrücklich innerhalb des Programms .
Tomáš Zato - Wiedereinsetzung Monica
34
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.
Dies gibt Informationen zur Betriebssystemarchitektur. Wenn ich mich nicht irre, muss dies nicht mit der JVM-Bitness identisch sein.
Codaddict
2
@codaddict, sieht so aus, als wäre es tatsächlich JVM-Bitness.
Bryantsai
20
@codaddict Das ist völlig falsch (und ich habe keine Ahnung, warum sechs Personen diesen Kommentar abgegeben haben.) "os.arch" soll die JVM-Version zurückgeben. Testen Sie es selbst und Gott helfe Ihnen, wenn Sie sich bei der Erkennung des Betriebssystems tatsächlich darauf verlassen.
Dies ist eine Zeichenfolge für das menschliche Auge und ohne eine strikte Definition gültiger Werte. Es ist keine gute Idee, sich darauf zu verlassen. Schreiben Sie stattdessen Code, der die tatsächliche Funktionalität überprüft.
Thorbjørn Ravn Andersen
15
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.
" 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
Dies ist clever, aber der Zugriff auf die Zeigergröße ist erheblich langsamer als bei den anderen Lösungen hier (die Initialisierung dauert einige Zeit).
BullyWiiPlaza
1
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 ").
Warum sollte man sich um eine Windowseinzige Lösung kümmern ?
Wenn Sie wissen müssen, auf welcher Bit-Version Sie ausgeführt werden, spielen Sie wahrscheinlich mit nativem Code herum, Windowssodass die Plattformunabhängigkeit ohnehin nicht im Fenster steht.
Antworten:
Sie rufen die Systemeigenschaft ab , die die Bitigkeit dieser JVM kennzeichnet mit:
Mögliche Ergebnisse sind:
"32"
- 32-Bit-JVM"64"
- 64-Bit-JVM"unknown"
- Unbekannte JVMWie in den HotSpot-FAQ beschrieben :
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.
quelle
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
.Führen Sie Folgendes aus, um nach einer 64-Bit-JVM zu suchen:
Wenn es sich nicht um eine 64-Bit-JVM handelt, erhalten Sie Folgendes:
Führen Sie folgende Schritte aus, um nach einer 32-Bit-JVM zu suchen:
Wenn es sich nicht um eine 32-Bit-JVM handelt, erhalten Sie Folgendes:
Diese Fahnen wurden in Java 7, hinzugefügt veraltete in Java 9, entfernt in Java 10 und nicht mehr auf moderne Versionen von Java.
quelle
java -d32 -version
, um zu überprüfen, ob Sie kein 32-Bit ausführen . Beide wünschen weiter zu arbeitenWin7
.java -d32 -version
und auch vonjava -d64 -version
.Geben
java -version
Sie einfach Ihre Konsole ein.Wenn eine 64-Bit-Version ausgeführt wird, wird folgende Meldung angezeigt:
Eine 32-Bit-Version zeigt etwas Ähnliches wie:
Beachten Sie
Client
statt64-Bit Server
in der dritten Zeile. DerClient/Server
Teil ist irrelevant, es ist das Fehlen des64-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.quelle
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:
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.
quelle
os.arch
hat viele mögliche Werte, es ist schwer zu sagen, ob es 32 oder 64 Bit ist. Siehe lopica.sourceforge.net/os.htmlErgänzende Informationen:
Bei einem laufenden Prozess können Sie Folgendes verwenden (zumindest bei einigen neueren Sun JDK5 / 6-Versionen):
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:
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. "
quelle
Unter Linux können Sie ELF-Header-Informationen mit einem der beiden folgenden Befehle abrufen:
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
o / p: Klasse: ELF 64
quelle
Wenn Sie JNA verwenden, können Sie prüfen, ob
com.sun.jna.Native.POINTER_SIZE == 4
(32 Bit) odercom.sun.jna.Native.POINTER_SIZE == 8
(64 Bit).quelle
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 ").
quelle
Wenn Sie JNA verwenden, können Sie dies tun
Platform.is64Bit()
.quelle
Für
Windows
können Sie denJava
Heimatort überprüfen . Wenn es enthält(x86)
, ist es32-bit
anders64-bit
:Beispielpfade:
Warum sollte man sich um eine
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.quelle
Um die Version von JVM zu erhalten, auf der das Programm gerade ausgeführt wird
quelle
1.8.0_172
odernull
weiter zurückJava 10
und beantwortet die Frage sowieso nicht.