Bagaimana saya bisa tahu jika saya menjalankan JVM 64-bit atau JVM 32-bit (dari dalam suatu program)?

563

Bagaimana saya bisa tahu jika JVM tempat aplikasi saya berjalan adalah 32 bit atau 64-bit? Secara khusus, fungsi atau properti apa yang dapat saya gunakan untuk mendeteksi ini dalam program?

BobMcGee
sumber
3
Karena penasaran, mengapa Anda perlu mengetahui ukuran alami dari sistem? Detail seperti ini disarikan jauh di Jawa, jadi Anda seharusnya (secara teori, setidaknya) tidak harus mengetahuinya.
Patrick Niedzielski
3
Ini memungkinkan saya memperkirakan kebutuhan memori untuk objek karena pointer. Keingintahuan juga - sepertinya harus ada jalan, tetapi saya belum pernah mendengarnya.
BobMcGee
85
"Detail" ini tidak disarikan ketika berinteraksi dengan Java Native Interface. DLL 32-bit tidak dapat dimuat dengan JVM 64-bit (dan sebaliknya). Jadi ini adalah informasi yang sangat penting bagi siapa pun yang menggunakan JNI. Sangat disayangkan bahwa sepertinya tidak ada cara portabel untuk mendapatkan info ini. Salah satu caranya adalah dengan pertama-tama mencoba memuat DLL versi 32-bit, dan jika gagal, coba versi 64-bit, dll. Jelek!
Joonas Pulakka
12
Situasi lain di mana membedakan antara 32 atau 64 bit JVM penting adalah untuk file yang dipetakan. Pada sistem 32 bit, hanya 2GB yang dapat dipetakan, jadi penting untuk memetakan dan menghapus segmen file yang sesuai sehingga batas ini tidak terlampaui, sedangkan pada 64 bit jvms batasnya jauh, jauh, jauh lebih tinggi.
Simone Gianni
2
Sangat menyenangkan untuk dapat memilih algoritma numerik yang akan tercepat pada mesin yang dimaksud.
dfeuer

Jawaban:

317

Anda mengambil properti sistem yang menandai bitness JVM ini dengan:

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

Kemungkinan hasil adalah:

  • "32" - JVM 32-bit
  • "64" - JVM 64-bit
  • "unknown" - JVM Tidak Diketahui

Seperti yang dijelaskan dalam FAQ HotSpot :

Saat menulis kode Java, bagaimana saya membedakan antara operasi 32 dan 64-bit?

Tidak ada API publik yang memungkinkan Anda untuk membedakan antara operasi 32 dan 64-bit. Pikirkan 64-bit hanya sebagai platform lain dalam penulisan, jalankan tradisi di mana saja. Namun, jika Anda ingin menulis kode yang spesifik platform (memalukan pada Anda), properti sistem sun.arch.data.model memiliki nilai "32", "64", atau "tidak dikenal".

Contoh di mana ini diperlukan adalah jika kode Java Anda bergantung pada pustaka asli, dan Anda perlu menentukan apakah memuat versi 32 atau 64-bit pustaka saat startup.

codaddict
sumber
22
Saya tidak akan berharap menemukan sun.*properti sistem dengan IBM JVM. Dengan kata lain, ini tidak portabel.
Pascal Thivent
8
Bagaimana Anda bisa tahu dari baris perintah? Jika Anda menjalankan 32-bit atau 64-bit? Hanya penasaran.
Xonatron
17
Mengapa jawaban yang diterima bergantung pada Matahari? "os.arch" akan mencapai hal yang sama tanpa harus menggunakan paket-paket sun berpemilik.
b1nary.atr0phy
7
@ b1naryatr0phy, apakah os.arch melaporkan Sistem Operasi, atau JVM? Saya sering menjalankan JVM 32-bit pada workstation 64-bit saya, untuk tujuan pengembangan.
skiphoppy
7
Properti ini didukung pada IBM JVMs, tetapi tidak pada GCJ. Lihat stackoverflow.com/questions/807263/…
Emmanuel Bourg
708

Untuk versi Java tertentu, Anda dapat memeriksa bitness JVM dari baris perintah dengan flag -d32dan -d64.

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

Untuk memeriksa JVM 64-bit, jalankan:

$ java -d64 -version

Jika ini bukan JVM 64-bit, Anda akan mendapatkan ini:

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

Demikian pula, untuk memeriksa JVM 32-bit, jalankan:

$ java -d32 -version

Jika ini bukan JVM 32-bit, Anda akan mendapatkan ini:

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

Bendera ini ditambahkan di Java 7, tidak lagi digunakan di Jawa 9, dihapus di Jawa 10, dan tidak lagi tersedia di versi Jawa modern.

gpampara
sumber
3
Meskipun ini baik untuk diketahui, itu tidak berguna b / c saya harus menjalankannya dari luar program atau menggunakan opsi java untuk memulai proses baru.
BobMcGee
13
Persis apa yang saya cari. Dan Anda dapat menjalankan java -d32 -versionuntuk memverifikasi bahwa Anda tidak menjalankan 32-bit. Keduanya ingin bekerja Win7.
Xonatron
31
Saya menggunakan Windows 7, dan saya mendapatkan kesalahan 'opsi tidak dikenal' dari java -d32 -version dan juga dari java -d64 -version .
ely
40
Jangan gunakan "-D64", karena itu melakukan sesuatu yang sangat berbeda. Ini mendefinisikan properti sistem yang disebut "64". Ini jelas bukan yang diinginkan di sini.
Jonathan Headland
9
Bendera -d32 atau -d64 hanya akan berfungsi untuk Java 7 atau lebih tinggi.
darrenmc
188

Ketikkan saja java -versionkonsol Anda.

Jika versi 64 bit berjalan, Anda akan mendapatkan pesan seperti:

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)

Versi 32 bit akan menampilkan sesuatu yang mirip dengan:

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)

Perhatikan Clientalih-alih 64-Bit Serverdi baris ketiga. Bagian Client/Serveritu tidak relevan, tidak adanya 64-Bityang penting.

Jika beberapa versi Java diinstal pada sistem Anda, navigasikan ke folder / bin versi Java yang ingin Anda periksa, dan ketikkan di java -versionsana.

Sedat Kilinc
sumber
tetapi dalam hp nonstop oss env saya tidak mendapatkan 64bit atau 32 bit
vels4j
28
OP secara khusus mengatakan dalam program .
Tomáš Zato - Reinstate Monica
34

Saya menginstal JVM 32-bit dan mencoba lagi, sepertinya yang berikut ini memberitahu Anda JVM bitness, bukan OS arch:

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

Ini diuji terhadap SUN dan IBM JVM (32 dan 64-bit). Jelas, properti sistem bukan hanya lengkungan sistem operasi.

bryantsai
sumber
7
Ini memberikan info arsitektur sistem operasi. Jika saya tidak salah, ini tidak perlu sama dengan JVM bitness.
codaddict
2
@codaddict, sepertinya itu memang JVM bitness.
bryantsai
20
@codaddict Itu benar-benar salah (dan saya tidak tahu mengapa enam orang memilih komentar itu.) "os.arch" dirancang untuk mengembalikan versi JVM. Uji sendiri dan tuhan membantu Anda jika Anda benar-benar mengandalkan ini untuk deteksi OS.
b1nary.atr0phy
6
os.archmemiliki banyak nilai yang mungkin, sulit untuk mengetahui apakah itu 32 atau 64 bit. Lihat lopica.sourceforge.net/os.html
Emmanuel Bourg
2
Ini adalah string yang ditujukan untuk mata manusia dan tanpa definisi ketat dari nilai yang valid, dengan mengandalkan ini bukan ide yang baik - tulis kode yang memeriksa fungsi sebenarnya.
Thorbjørn Ravn Andersen
15

Info pelengkap:

Pada proses yang berjalan Anda dapat menggunakan (setidaknya dengan beberapa versi Sun JDK5 / 6 baru-baru ini):

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

di mana 14680 adalah PID dari jvm menjalankan aplikasi. "os.arch" juga berfungsi.

Skenario lain juga didukung:

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

Namun pertimbangkan juga catatan ini:

" CATATAN - Utilitas ini tidak didukung dan mungkin atau mungkin tidak tersedia dalam versi JDK di masa depan. Dalam Sistem Windows di mana dbgent.dll tidak ada, 'Alat Debugging untuk Windows' perlu diinstal agar alat-alat ini berfungsi. Juga Variabel lingkungan PATH harus berisi lokasi jvm.dll yang digunakan oleh proses target atau lokasi dari mana file Crash Dump diproduksi. "

redup
sumber
7

Di Linux, Anda bisa mendapatkan informasi header ELF dengan menggunakan salah satu dari dua perintah berikut:

file {YOUR_JRE_LOCATION_HERE}/bin/java

o / p: ELF 64-bit LSB yang dapat dieksekusi , AMD x86-64, versi 1 (SYSV), untuk GNU / Linux 2.4.0, terhubung secara dinamis (menggunakan shared libs), untuk GNU / Linux 2.4.0, tidak dilucuti

atau

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

o / p: Kelas: ELF 64

rahang
sumber
6

Jika Anda menggunakan JNA, Anda dapat memeriksa apakah com.sun.jna.Native.POINTER_SIZE == 4(32 bit) atau com.sun.jna.Native.POINTER_SIZE == 8(64 bit).

Anthony Hayward
sumber
Ini cerdas tetapi mengakses ukuran pointer secara signifikan lebih lambat daripada solusi lain di sini (perlu beberapa saat untuk menginisialisasi).
BullyWiiPlaza
1

Di bawah Windows 7 di " Control Panel " di bawah " Program | Program dan Fitur ", varian JRE & JDK 64-bit didaftar dengan " 64-bit " dalam tanda kurung (mis. " Java SE Development Kit 7 Pembaruan 65 (64-Bit) ) "), sedangkan untuk varian 32-bit varian tidak disebutkan dalam tanda kurung (mis. hanya" Java SE Development Kit 8 Update 60 ").

pengguna1364368
sumber
1

Jika Anda menggunakan JNA, Anda bisa melakukan ini Platform.is64Bit().

鹞 之 神 乐
sumber
-1

Sebab Windows, Anda bisa mengecek Javalokasi rumah. Jika mengandung (x86)itu 32-bitsebaliknya 64-bit:

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

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

Contoh jalur:

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

Mengapa peduli satu- Windowssatunya solusi?

Jika Anda perlu tahu versi bit mana yang Anda jalankan, Anda cenderung mengutak-atik kode asli Windowssehingga platform-independensi tetap berada di luar jendela.

BullyWiiPlaza
sumber
-2

Untuk mendapatkan versi JVM saat ini menjalankan program

System.out.println(Runtime.class.getPackage().getImplementationVersion());
Olu Smith
sumber
Apakah itu melaporkan untuk JVM atau sistem operasi? Anda dapat menjalankan JVM 32-bit pada sistem operasi 64-bit.
Thorbjørn Ravn Andersen
Itu tidak menggunakan JMX?
Thorbjørn Ravn Andersen
2
Ini mengembalikan sesuatu seperti 1.8.0_172atau nullaktif Java 10dan tetap tidak menjawab pertanyaan.
BullyWiiPlaza