Uygulamamın çalıştığı JVM'nin 32 bit mi yoksa 64 bit mi olduğunu nasıl anlayabilirim? Özellikle, bunu program içinde tespit etmek için hangi işlevleri veya özellikleri kullanabilirim?
Uygulamamın çalıştığı JVM'nin 32 bit mi yoksa 64 bit mi olduğunu nasıl anlayabilirim? Özellikle, bunu program içinde tespit etmek için hangi işlevleri veya özellikleri kullanabilirim?
Yanıtlar:
Bu JVM'nin bitliğini işaretleyen system özelliğini alırsınız:
System.getProperty("sun.arch.data.model");
Olası sonuçlar:
"32"
- 32 bit JVM"64"
- 64 bit JVM"unknown"
- Bilinmeyen JVMHotSpot SSS bölümünde açıklandığı gibi :
Java kodu yazarken 32 ve 64 bitlik işlemleri nasıl ayırt edebilirim?
32 ve 64 bitlik işlemleri ayırt etmenizi sağlayan genel bir API yoktur. 64-bit'i bir kez yazarken başka bir platform olarak düşünün, her yerde geleneği çalıştırın. Ancak, platforma özgü (size utanç verici) bir kod yazmak isterseniz, sun.arch.data.model sistem özelliği "32", "64" veya "bilinmeyen" değerine sahiptir.
Bunun gerekli olabileceği bir örnek, Java kodunuzun yerel kitaplıklara bağlı olması ve başlangıçta kitaplıkların 32 veya 64 bit sürümünün yüklenip yüklenmeyeceğini belirlemeniz gerektiğidir.
sun.*
IBM JVM ile sistem özellikleri bulmayı beklemiyordum . Başka bir deyişle, taşınabilir değil.
Java'nın bazı sürümleri için, bayraklarla komut satırından JVM BITNESS kontrol edebilirsiniz -d32
ve -d64
.
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
64 bit JVM'yi kontrol etmek için şunu çalıştırın:
$ java -d64 -version
64 bit JVM değilse, şunları elde edersiniz:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
Benzer şekilde, 32 bit JVM'yi kontrol etmek için şunu çalıştırın:
$ java -d32 -version
32 bit JVM değilse, bunu elde edersiniz:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
Bu bayraklar Java 7'ye eklendi, Java 9'da kullanımdan kaldırıldı , Java 10'da kaldırıldı ve artık Java'nın modern sürümlerinde mevcut değil.
java -d32 -version
32 bit çalıştırmadığınızı doğrulamak için çalıştırabilirsiniz. Her ikisi de üzerinde çalışmak ister Win7
.
java -d32 -version
ve ayrıca gelen java -d64 -version
.
Sadece java -version
konsolunuzu yazın.
64 bit sürüm çalışıyorsa, şöyle bir mesaj alırsınız:
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)
32 bitlik sürüm aşağıdakine benzer bir şey gösterir:
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)
Üçüncü satır Client
yerine not alın 64-Bit Server
. Client/Server
Bölümü, bu yokluğu var, alakasız 64-Bit
olduğunu konularla.
Sisteminizde birden fazla Java sürümü yüklüyse, kontrol etmek istediğiniz Java sürümünün / bin klasörüne gidin ve java -version
oraya yazın.
32-bit JVM yükledim ve tekrar denedim, aşağıdaki gibi size OS arch değil JVM bitness söyler gibi görünüyor:
System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM
Bu hem SUN hem de IBM JVM'ye (32 ve 64 bit) karşı test edildi. Açıkçası, sistem özelliği sadece işletim sistemi kemeri değildir.
os.arch
birçok olası değere sahipse, 32 mi yoksa 64 bit mi olduğunu söylemek zor. Bkz. Lopica.sourceforge.net/os.html
Tamamlayıcı bilgiler:
Bir Açık çalışan süreç (bazı son güneş JDK5 / 6 sürümleri ile en azından) kullanabilir:
$ /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
burada 14680 uygulamayı çalıştıran jvm PID'sidir. "os.arch" da çalışır.
Ayrıca diğer senaryolar desteklenir:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
Ancak bu notu da göz önünde bulundurun:
" NOT - Bu yardımcı program desteklenmez ve JDK'nın gelecekteki sürümlerinde kullanılabilir veya bulunmayabilir. Dbgent.dll dosyasının bulunmadığı Windows Sistemlerinde, bu araçların çalışması için 'Windows için Hata Ayıklama Araçları'nın yüklü olması gerekir. PATH ortam değişkeni, hedef işlem tarafından kullanılan jvm.dll dosyasının konumunu veya Crash Dump dosyasının üretildiği konumu içermelidir. "
Linux'ta, aşağıdaki iki komuttan birini kullanarak ELF başlık bilgilerini alabilirsiniz:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o / p: GNU / Linux 2.4.0 için ELF 64 bit LSB yürütülebilir , AMD x86-64, sürüm 1 (SYSV), dinamik olarak bağlı (paylaşılan kütüphaneleri kullanır), GNU / Linux 2.4.0 için, soyulmamış
veya
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'
o / p: Sınıf: ELF 64
JNA kullanıyorsanız, com.sun.jna.Native.POINTER_SIZE == 4
(32 bit) veya com.sun.jna.Native.POINTER_SIZE == 8
(64 bit) olup olmadığını kontrol edebilirsiniz .
Windows 7 altında, " Programlar | Programlar ve Özellikler " altındaki " Denetim Masası " nda JRE ve JDK'nın 64 bit varyantları parantez içinde " 64 bit " ile listelenir (örn. " Java SE Geliştirme Kiti 7 Güncelleme 65 (64 Bit) ) "), 32 bitlik varyantlarda ise parantez içinde varyanttan söz edilmez (örneğin, yalnızca" Java SE Geliştirme Kiti 8 Güncelleme 60 ").
İçin Windows
,Java
ev konumunu . O içeriyorsa (x86)
o 32-bit
aksi 64-bit
:
public static boolean is32Bit()
{
val javaHome = System.getProperty("java.home");
return javaHome.contains("(x86)");
}
public static boolean is64Bit()
{
return !is32Bit();
}
Örnek yollar:
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
tek bir çözümü ?Hangi bit sürümünü çalıştırdığınızı bilmeniz gerekiyorsa, Windows
platform bağımsızlığı zaten pencereden dışarıda olacak şekilde yerel kodla uğraşıyorsunuzdur.
Şu anda programı çalıştıran JVM sürümünü edinmek için
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
veya null
açık bir şey döndürür Java 10
ve yine de soruyu cevaplamaz.