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?
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.
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
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.
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.
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. "
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.
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
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 " ).
Wenn Sie JNA verwenden, können Sie diesPlatform.is64Bit()
tun.
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
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.