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?
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:
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.
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.
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 -versiondan juga darijava -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.
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.
" 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. "
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
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 ").
Jika Anda perlu tahu versi bit mana yang Anda jalankan, Anda cenderung mengutak-atik kode asli Windowssehingga platform-independensi tetap berada di luar jendela.
Jawaban:
Anda mengambil properti sistem yang menandai bitness JVM ini dengan:
Kemungkinan hasil adalah:
"32"
- JVM 32-bit"64"
- JVM 64-bit"unknown"
- JVM Tidak DiketahuiSeperti yang dijelaskan dalam FAQ HotSpot :
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.
sumber
sun.*
properti sistem dengan IBM JVM. Dengan kata lain, ini tidak portabel.Untuk versi Java tertentu, Anda dapat memeriksa bitness JVM dari baris perintah dengan flag
-d32
dan-d64
.Untuk memeriksa JVM 64-bit, jalankan:
Jika ini bukan JVM 64-bit, Anda akan mendapatkan ini:
Demikian pula, untuk memeriksa JVM 32-bit, jalankan:
Jika ini bukan JVM 32-bit, Anda akan mendapatkan ini:
Bendera ini ditambahkan di Java 7, tidak lagi digunakan di Jawa 9, dihapus di Jawa 10, dan tidak lagi tersedia di versi Jawa modern.
sumber
java -d32 -version
untuk memverifikasi bahwa Anda tidak menjalankan 32-bit. Keduanya ingin bekerjaWin7
.java -d32 -version
dan juga darijava -d64 -version
.Ketikkan saja
java -version
konsol Anda.Jika versi 64 bit berjalan, Anda akan mendapatkan pesan seperti:
Versi 32 bit akan menampilkan sesuatu yang mirip dengan:
Perhatikan
Client
alih-alih64-Bit Server
di baris ketiga. BagianClient/Server
itu tidak relevan, tidak adanya64-Bit
yang penting.Jika beberapa versi Java diinstal pada sistem Anda, navigasikan ke folder / bin versi Java yang ingin Anda periksa, dan ketikkan di
java -version
sana.sumber
Saya menginstal JVM 32-bit dan mencoba lagi, sepertinya yang berikut ini memberitahu Anda JVM bitness, bukan OS arch:
Ini diuji terhadap SUN dan IBM JVM (32 dan 64-bit). Jelas, properti sistem bukan hanya lengkungan sistem operasi.
sumber
os.arch
memiliki banyak nilai yang mungkin, sulit untuk mengetahui apakah itu 32 atau 64 bit. Lihat lopica.sourceforge.net/os.htmlInfo pelengkap:
Pada proses yang berjalan Anda dapat menggunakan (setidaknya dengan beberapa versi Sun JDK5 / 6 baru-baru ini):
di mana 14680 adalah PID dari jvm menjalankan aplikasi. "os.arch" juga berfungsi.
Skenario lain juga didukung:
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. "
sumber
Di Linux, Anda bisa mendapatkan informasi header ELF dengan menggunakan salah satu dari dua perintah berikut:
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
o / p: Kelas: ELF 64
sumber
Jika Anda menggunakan JNA, Anda dapat memeriksa apakah
com.sun.jna.Native.POINTER_SIZE == 4
(32 bit) ataucom.sun.jna.Native.POINTER_SIZE == 8
(64 bit).sumber
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 ").
sumber
Jika Anda menggunakan JNA, Anda bisa melakukan ini
Platform.is64Bit()
.sumber
Sebab
Windows
, Anda bisa mengecekJava
lokasi rumah. Jika mengandung(x86)
itu32-bit
sebaliknya64-bit
:Contoh jalur:
Mengapa peduli satu-
Windows
satunya solusi?Jika Anda perlu tahu versi bit mana yang Anda jalankan, Anda cenderung mengutak-atik kode asli
Windows
sehingga platform-independensi tetap berada di luar jendela.sumber
Untuk mendapatkan versi JVM saat ini menjalankan program
sumber
1.8.0_172
ataunull
aktifJava 10
dan tetap tidak menjawab pertanyaan.