64 bit JVM mi yoksa 32 bit JVM mi (bir programın içinden) çalıştığımı nasıl anlayabilirim?


563

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?


3
Sadece meraktan, neden sistemin doğal boyutunu bilmelisiniz? Bunun gibi detaylar Java'da soyutlanmıştır, bu yüzden (en azından teoride) bunları bilmeniz gerekmemelidir.
Patrick Niedzielski

3
İşaretçilerden dolayı nesnelerin bellek gereksinimlerini kabaca tahmin etmeme izin veriyor. Merak da - bir yol olmalı gibi görünüyordu, ama bunu hiç duymamıştım.
BobMcGee

85
Bu "ayrıntı", Java Yerel Arayüzü ile etkileşime girerken soyutlanmaz. 32 bit DLL dosyaları 64 bit JVM ile yüklenemez (veya tam tersi). Bu JNI kullanan herkes için oldukça önemli bir bilgidir. Bu bilgiyi elde etmenin taşınabilir bir yolu olmadığı üzücü. Bunun bir yolu ilk olarak DLL'in 32 bit sürümünü yüklemeyi denemek ve başarısız olursa 64 bit sürümünü vb. Deneyin. Çirkin!
Joonas Pulakka

12
32 veya 64 bit JVM'leri ayırt etmenin önemli olduğu başka bir durum da eşlenen dosyalar içindir. 32 bit sistemlerde yalnızca 2 GB eşlenebilir, bu nedenle dosya segmentlerini eşleştirmek ve eşlemelerini kaldırmak önemlidir, böylece bu sınır aşılmaz, 64 bit jvms'de sınır çok, çok, çok daha yüksektir.
Simone Gianni

2
Söz konusu makinede en hızlı olacak sayısal algoritmayı seçebilmek gerçekten güzel.
dfeuer

Yanıtlar:


317

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 JVM

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


22
sun.*IBM JVM ile sistem özellikleri bulmayı beklemiyordum . Başka bir deyişle, taşınabilir değil.
Pascal Thivent

8
Komut satırından nasıl anlatabilirsiniz? 32 bit mi yoksa 64 bit mi çalıştırıyorsanız? Sadece merak.
Xonatron

17
Kabul edilen cevap neden Güneş'e bağımlı? "os.arch" aynı şeyi özel güneş paketleri kullanmak zorunda kalmadan gerçekleştirecektir.
b1nary.atr0phy

7
@ b1naryatr0phy, os.arch İşletim Sistemi veya JVM hakkında rapor veriyor mu? Geliştirme amacıyla 64-bit iş istasyonumda sıklıkla 32-bit JVM çalıştırıyorum.
skiphoppy

7
Bu özellik IBM JVM'lerde desteklenir, ancak GCJ'de desteklenmez. Bkz. Stackoverflow.com/questions/807263/…
Emmanuel Bourg

707

Java'nın bazı sürümleri için, bayraklarla komut satırından JVM BITNESS kontrol edebilirsiniz -d32ve -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.


3
Bu bilmek iyi olsa da, yararlı değil b / c Ben programın dışından çalıştırmak veya yeni bir işlem başlatmak için java seçenekleri kullanmanız gerekir.
BobMcGee

13
Tam aradığım şey. Ve java -d32 -version32 bit çalıştırmadığınızı doğrulamak için çalıştırabilirsiniz. Her ikisi de üzerinde çalışmak ister Win7.
Xonatron

31
Ben Windows 7 değilim ve gelen 'tanınmadı seçenek' hatası alıyorum java -d32 -version ve ayrıca gelen java -d64 -version .
ely

40
"-D64" kullanmayın, çünkü bu tamamen farklı bir şey yapar. "64" adında bir sistem özelliği tanımlar. Burada istenen şey kesinlikle bu değil.
Jonathan Headland

9
-D32 veya -d64 bayrakları yalnızca Java 7 veya üstü için çalışır.
darrenmc

188

Sadece java -versionkonsolunuzu 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 Clientyerine not alın 64-Bit Server. Client/ServerBölümü, bu yokluğu var, alakasız 64-Bitolduğ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 -versionoraya yazın.



28
OP özellikle program içinde diyor .
Tomáš Zato - Monica'yı eski durumuna döndür

34

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.


7
Bu, İşletim sistemi mimarisi hakkında bilgi verir. Eğer yanılmıyorsam, bunun JVM bitness ile aynı olması gerekmez.
codaddict

2
@codaddict, gerçekten JVM bitness gibi görünüyor.
10:10

20
@codaddict Bu tamamen yanlış (ve neden altı ppl bu yorumu oy verdi hiçbir fikrim yok.) "os.arch" JVM sürümünü döndürmek için tasarlanmıştır. OS tespiti için buna güveniyorsanız, kendiniz için test edin ve tanrı size yardımcı olacaktır.
b1nary.atr0phy

6
os.archbirçok olası değere sahipse, 32 mi yoksa 64 bit mi olduğunu söylemek zor. Bkz. Lopica.sourceforge.net/os.html
Emmanuel Bourg

2
Bu, insan gözlerine yönelik ve geçerli değerlerin katı bir tanımı olmadan bir dizedir, buna güvenmek iyi bir fikir değildir - bunun yerine gerçek işlevselliği kontrol eden bir kod yazın.
Thorbjørn Ravn Andersen

15

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


7

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


6

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 .


Bu zekidir, ancak işaretçi boyutuna erişmek buradaki diğer çözümlerden önemli ölçüde daha yavaştır (başlatılması biraz zaman alır).
BullyWiiPlaza

1

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



-1

İçin Windows,Java ev konumunu . O içeriyorsa (x86)o 32-bitaksi 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

Neden bir Windows tek bir çözümü ?

Hangi bit sürümünü çalıştırdığınızı bilmeniz gerekiyorsa, Windowsplatform bağımsızlığı zaten pencereden dışarıda olacak şekilde yerel kodla uğraşıyorsunuzdur.


-2

Şu anda programı çalıştıran JVM sürümünü edinmek için

System.out.println(Runtime.class.getPackage().getImplementationVersion());

Bu JVM veya işletim sistemi için rapor verir mi? 64 bit işletim sisteminde 32 bit JVM çalıştırabilirsiniz.
Thorbjørn Ravn Andersen

JMX kullanmıyor mu?
Thorbjørn Ravn Andersen

2
Bu gibi 1.8.0_172veya nullaçık bir şey döndürür Java 10ve yine de soruyu cevaplamaz.
BullyWiiPlaza
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.