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?

BobMcGee
quelle
3
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:

System.getProperty("sun.arch.data.model");

Mögliche Ergebnisse sind:

  • "32" - 32-Bit-JVM
  • "64" - 64-Bit-JVM
  • "unknown" - Unbekannte JVM

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

Codaddict
quelle
22
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.
Skiphoppy
7
Diese Eigenschaft wird von IBM JVMs unterstützt, nicht jedoch von GCJ. Siehe stackoverflow.com/questions/807263/…
Emmanuel Bourg
707

Für bestimmte Java-Versionen können Sie die Bitigkeit der JVM über die Befehlszeile mit den Flags -d32und ü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.

gpampara
quelle
3
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 -version und auch von java -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.

Sedat Kilinc
quelle
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.

Bryantsai
quelle
7
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.
b1nary.atr0phy
6
os.archhat viele mögliche Werte, es ist schwer zu sagen, ob es 32 oder 64 Bit ist. Siehe lopica.sourceforge.net/os.html
Emmanuel Bourg
2
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.

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

dim
quelle
7

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

Kiefernnn
quelle
6

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

Anthony Hayward
quelle
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 ").

user1364368
quelle
1

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

鹞 之 神 乐
quelle
-1

Für Windowskönnen Sie den JavaHeimatort überprüfen . Wenn es enthält (x86), ist es 32-bitanders 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 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.

BullyWiiPlaza
quelle
-2

Um die Version von JVM zu erhalten, auf der das Programm gerade ausgeführt wird

System.out.println(Runtime.class.getPackage().getImplementationVersion());
Olu Smith
quelle
Würde das für die JVM oder das Betriebssystem berichten? Sie können eine 32-Bit-JVM unter einem 64-Bit-Betriebssystem ausführen.
Thorbjørn Ravn Andersen
Das nutzt JMX nicht?
Thorbjørn Ravn Andersen
2
Dies gibt so etwas wie 1.8.0_172oder nullweiter zurück Java 10und beantwortet die Frage sowieso nicht.
BullyWiiPlaza