Jak mogę sprawdzić, czy korzystam z 64-bitowej JVM czy 32-bitowej JVM (z poziomu programu)?

563

Jak mogę sprawdzić, czy JVM, w którym działa moja aplikacja, jest 32-bitowy czy 64-bitowy? W szczególności, jakich funkcji lub właściwości mogę użyć do wykrycia tego w programie?

BobMcGee
źródło
3
Właśnie z ciekawości, dlaczego miałbyś chcieć znać naturalny rozmiar systemu? Takie szczegóły są abstrakcyjne w Javie, więc nie powinieneś (przynajmniej teoretycznie) ich znać.
Patrick Niedzielski
3
Pozwala mi z grubsza oszacować wymagania dotyczące pamięci dla obiektów ze względu na wskaźniki. Ciekawość też - wydawało się, że powinien istnieć sposób, ale nigdy o tym nie słyszałem.
BobMcGee
85
Ten „szczegół” nie jest wyodrębniany podczas interakcji z rodzimym interfejsem Java. 32-bitowych bibliotek DLL nie można załadować za pomocą 64-bitowej maszyny JVM (i odwrotnie). Jest to więc bardzo ważna informacja dla każdego, kto korzysta z JNI. Szkoda, że ​​wydaje się, że nie ma przenośnego sposobu na uzyskanie tych informacji. Jednym ze sposobów jest najpierw załadowanie 32-bitowej wersji biblioteki DLL, a jeśli się nie powiedzie, wypróbuj wersję 64-bitową itp. Brzydka!
Joonas Pulakka
12
Inną sytuacją, w której ważne jest rozróżnienie między 32 lub 64 bitowymi maszynami JVM, jest mapowanie plików. W systemach 32-bitowych można zmapować tylko 2 GB, dlatego ważne jest odpowiednie mapowanie i odwzorowywanie segmentów plików odpowiednio, aby ten limit nie został przekroczony, podczas gdy w 64-bitowych Jvms limit jest znacznie, dużo, dużo wyższy.
Simone Gianni,
2
Naprawdę miło jest wybrać algorytm numeryczny, który będzie najszybszy na danym komputerze.
dfeuer

Odpowiedzi:

317

Ci odzyskać właściwości systemu , który wyznacza bitness tego JVM z:

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

Możliwe wyniki to:

  • "32" - 32-bitowa JVM
  • "64" - 64-bitowa JVM
  • "unknown" - Nieznany JVM

Zgodnie z opisem w HotSpot FAQ :

Jak pisząc kod Java, jak odróżnić operacje 32- i 64-bitowe?

Nie ma publicznego interfejsu API, który pozwala rozróżnić operacje 32- i 64-bitowe. Myśl o wersji 64-bitowej jako o jednej platformie do zapisu, działającej wszędzie. Jeśli jednak chcesz napisać kod specyficzny dla platformy (wstydź się), właściwość systemowa sun.arch.data.model ma wartość „32”, „64” lub „nieznany”.

Przykładem, w którym może to być konieczne, jest to, jeśli kod Java zależy od bibliotek rodzimych i należy określić, czy podczas uruchamiania należy załadować 32- lub 64-bitową wersję bibliotek.

kodaddict
źródło
22
Nie spodziewałbym się znaleźć sun.*właściwości systemu za pomocą IBM JVM. Innymi słowy, nie jest przenośny.
Pascal Thivent
8
Jak rozpoznać z wiersza poleceń? Jeśli korzystasz z wersji 32-bitowej lub 64-bitowej? Po prostu ciekawy.
Xonatron
17
Dlaczego zaakceptowana odpowiedź zależy od Słońca? „os.arch” osiągnie to samo bez konieczności używania zastrzeżonych pakietów Sun.
b1nary.atr0phy
7
@ b1naryatr0phy, czy os.arch zgłasza system operacyjny lub JVM? Często w celach programistycznych uruchamiam 32-bitową maszynę JVM na mojej 64-bitowej stacji roboczej.
skiphoppy
7
Ta właściwość jest obsługiwana w IBM JVM, ale nie w GCJ. Zobacz stackoverflow.com/questions/807263/…
Emmanuel Bourg
707

W przypadku niektórych wersji Java można sprawdzić bitowość JVM z wiersza polecenia za pomocą flag -d32i -d64.

$ java -help
...
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available

Aby sprawdzić 64-bitową maszynę JVM, uruchom:

$ java -d64 -version

Jeśli nie jest to 64-bitowa maszyna JVM, otrzymasz:

Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.

Podobnie, aby sprawdzić 32-bitową maszynę JVM, uruchom:

$ java -d32 -version

Jeśli nie jest to 32-bitowa maszyna JVM, otrzymasz:

Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.

Te flagi zostały dodane w Javie 7, przestarzałe w Javie 9, usunięte w Javie 10 i nie są już dostępne w nowoczesnych wersjach Java.

gpampara
źródło
3
Chociaż warto to wiedzieć, nie jest użyteczne, ponieważ muszę go uruchomić spoza programu lub użyć opcji Java, aby rozpocząć nowy proces.
BobMcGee
13
Dokładnie tego szukałem. Możesz uruchomić, java -d32 -versionaby sprawdzić, czy nie korzystasz z wersji 32-bitowej. Oboje chcą pracować Win7.
Xonatron
31
Korzystam z systemu Windows 7 i pojawia się błąd „nierozpoznana opcja” java -d32 -version zi java -d64 -version .
ely
40
Nie używaj „-D64”, ponieważ robi to coś zupełnie innego. Definiuje właściwość systemową o nazwie „64”. To zdecydowanie nie jest to, czego tu chcemy.
Jonathan Headland
9
Flagi -d32 lub -d64 będą działać tylko dla Java 7 lub nowszej.
darrenmc
187

Po prostu wpisz java -versionswoją konsolę.

Jeśli działa wersja 64-bitowa, pojawi się komunikat:

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)

Wersja 32-bitowa pokaże coś podobnego do:

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)

Uwaga Clientzamiast 64-Bit Serverw trzeciej linii. Ta Client/Serverczęść jest nieistotna, liczy się jej brak 64-Bit.

Jeśli w systemie zainstalowanych jest wiele wersji Java, przejdź do folderu / bin wersji Java, którą chcesz sprawdzić, i wpisz java -versiontam.

Sedat Kilinc
źródło
ale w hp nonstop oss env nie dostaję 64-bitowego lub 32-bitowego
vels4j
28
OP wyraźnie mówi w ramach programu .
Tomáš Zato - Przywróć Monikę
34

Zainstalowałem 32-bitową maszynę JVM i ponowiłem ją, wygląda na to, że poniższe informacje wskazują bitowość maszyny JVM, a nie arch. Systemu operacyjnego:

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

Zostało to przetestowane zarówno dla SUN, jak i IBM JVM (32 i 64-bit). Oczywiście właściwość systemowa to nie tylko łuk systemu operacyjnego.

bryantsai
źródło
7
Daje to informacje o architekturze systemu operacyjnego. Jeśli się nie mylę, nie musi to być bitowość JVM.
codaddict
2
@codaddict, wygląda na to, że jest to rzeczywiście bitmapa JVM.
bryantsai
20
@codaddict To jest całkowicie fałszywe (i nie mam pojęcia, dlaczego sześć ppl głosowało za tym komentarzem.) „os.arch” ma na celu zwrócenie wersji JVM. Sprawdź to sam i niech Bóg ci pomoże, jeśli faktycznie polegasz na wykrywaniu systemu operacyjnego.
b1nary.atr0phy
6
os.archma wiele możliwych wartości, trudno jest stwierdzić, czy jest to 32 czy 64 bity. Zobacz lopica.sourceforge.net/os.html
Emmanuel Bourg,
2
Jest to ciąg przeznaczony dla ludzkich oczu i bez ścisłej definicji prawidłowych wartości, poleganie na tym nie jest dobrym pomysłem - zamiast tego pisz kod, który sprawdza rzeczywistą funkcjonalność.
Thorbjørn Ravn Andersen
15

Informacje uzupełniające:

W uruchomionym procesie możesz użyć (przynajmniej w niektórych najnowszych wersjach Sun JDK5 / 6):

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

gdzie 14680 to PID jvm uruchomionej aplikacji. Działa również „os.arch”.

Obsługiwane są również inne scenariusze:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 

Zastanów się jednak również nad tą uwagą:

UWAGA - To narzędzie nie jest obsługiwane i może być dostępne w przyszłych wersjach JDK. W systemach Windows, w których nie ma pliku dbgent.dll, należy zainstalować„ Narzędzia debugowania dla systemu Windows ”, aby te narzędzia działały. Zmienna środowiskowa PATH powinna zawierać lokalizację pliku jvm.dll używaną przez proces docelowy lub lokalizację, z której utworzono plik zrzutu awaryjnego. ”

ciemny
źródło
7

W systemie Linux informacje o nagłówkach ELF można uzyskać za pomocą jednego z dwóch poniższych poleceń:

file {YOUR_JRE_LOCATION_HERE}/bin/java

o / p: ELF 64-bitowy plik wykonywalny LSB , AMD x86-64, wersja 1 (SYSV), dla GNU / Linux 2.4.0, dynamicznie połączony (używa wspólnych bibliotek), dla GNU / Linux 2.4.0, bez usuwania

lub

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

o / p: klasa: ELF 64

jawsnnn
źródło
6

Jeśli używasz JNA, możesz sprawdzić, czy com.sun.jna.Native.POINTER_SIZE == 4(32-bitowy) czy com.sun.jna.Native.POINTER_SIZE == 8(64-bitowy).

Anthony Hayward
źródło
Jest to sprytne, ale dostęp do rozmiaru wskaźnika jest znacznie wolniejszy niż w przypadku innych rozwiązań (potrzebuje trochę czasu na zainicjowanie).
BullyWiiPlaza,
1

W systemie Windows 7 w „ Panelu sterowania ” w „ Programy | Programy i funkcje ” 64-bitowe wersje JRE i JDK są wymienione w nawiasach jako „ 64-bit ” (np. „ Java SE Development Kit 7 Update 65 (64-bit) ) ”), podczas gdy dla wariantów 32-bitowych wariant nie jest wymieniony w nawiasach (np.„ Java SE Development Kit 8 Update 60 ”).

użytkownik1364368
źródło
1

Jeśli używasz JNA, możesz to zrobić Platform.is64Bit().

鹞 之 神 乐
źródło
-1

Dla Windowsmożna sprawdzić Javalokalizację domu. Jeśli zawiera (x86), jest 32-bitinaczej 64-bit:

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

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

Przykładowe ścieżki:

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

Po co dbać o Windowsjedyne rozwiązanie?

Jeśli chcesz wiedzieć, na której wersji bitowej pracujesz, prawdopodobnie bawisz się natywnym kodem, Windowsaby i tak niezależność od platformy była poza oknem.

BullyWiiPlaza
źródło
-2

Aby uzyskać wersję JVM aktualnie uruchomionego programu

System.out.println(Runtime.class.getPackage().getImplementationVersion());
Olu Smith
źródło
Czy ten raport dotyczy JVM lub systemu operacyjnego? Możesz uruchomić 32-bitową maszynę JVM w 64-bitowym systemie operacyjnym.
Thorbjørn Ravn Andersen
To nie używa JMX?
Thorbjørn Ravn Andersen
2
Zwraca coś takiego 1.8.0_172lub nullwłączone Java 10i i tak nie odpowiada na pytanie.
BullyWiiPlaza