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?
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.
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.
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.
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.
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”.
„ 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. ”
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
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 ”).
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.
Odpowiedzi:
Ci odzyskać właściwości systemu , który wyznacza bitness tego JVM z:
Możliwe wyniki to:
"32"
- 32-bitowa JVM"64"
- 64-bitowa JVM"unknown"
- Nieznany JVMZgodnie z opisem w HotSpot FAQ :
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.
źródło
sun.*
właściwości systemu za pomocą IBM JVM. Innymi słowy, nie jest przenośny.W przypadku niektórych wersji Java można sprawdzić bitowość JVM z wiersza polecenia za pomocą flag
-d32
i-d64
.Aby sprawdzić 64-bitową maszynę JVM, uruchom:
Jeśli nie jest to 64-bitowa maszyna JVM, otrzymasz:
Podobnie, aby sprawdzić 32-bitową maszynę JVM, uruchom:
Jeśli nie jest to 32-bitowa maszyna JVM, otrzymasz:
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.
źródło
java -d32 -version
aby sprawdzić, czy nie korzystasz z wersji 32-bitowej. Oboje chcą pracowaćWin7
.java -d32 -version
zijava -d64 -version
.Po prostu wpisz
java -version
swoją konsolę.Jeśli działa wersja 64-bitowa, pojawi się komunikat:
Wersja 32-bitowa pokaże coś podobnego do:
Uwaga
Client
zamiast64-Bit Server
w trzeciej linii. TaClient/Server
część jest nieistotna, liczy się jej brak64-Bit
.Jeśli w systemie zainstalowanych jest wiele wersji Java, przejdź do folderu / bin wersji Java, którą chcesz sprawdzić, i wpisz
java -version
tam.źródło
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:
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.
źródło
os.arch
ma wiele możliwych wartości, trudno jest stwierdzić, czy jest to 32 czy 64 bity. Zobacz lopica.sourceforge.net/os.htmlInformacje uzupełniające:
W uruchomionym procesie możesz użyć (przynajmniej w niektórych najnowszych wersjach Sun JDK5 / 6):
gdzie 14680 to PID jvm uruchomionej aplikacji. Działa również „os.arch”.
Obsługiwane są również inne scenariusze:
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. ”
źródło
W systemie Linux informacje o nagłówkach ELF można uzyskać za pomocą jednego z dwóch poniższych poleceń:
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
o / p: klasa: ELF 64
źródło
Jeśli używasz JNA, możesz sprawdzić, czy
com.sun.jna.Native.POINTER_SIZE == 4
(32-bitowy) czycom.sun.jna.Native.POINTER_SIZE == 8
(64-bitowy).źródło
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 ”).
źródło
Jeśli używasz JNA, możesz to zrobić
Platform.is64Bit()
.źródło
Dla
Windows
można sprawdzićJava
lokalizację domu. Jeśli zawiera(x86)
, jest32-bit
inaczej64-bit
:Przykładowe ścieżki:
Po co dbać o
Windows
jedyne rozwiązanie?Jeśli chcesz wiedzieć, na której wersji bitowej pracujesz, prawdopodobnie bawisz się natywnym kodem,
Windows
aby i tak niezależność od platformy była poza oknem.źródło
Aby uzyskać wersję JVM aktualnie uruchomionego programu
źródło
1.8.0_172
lubnull
włączoneJava 10
i i tak nie odpowiada na pytanie.