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?
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?
Jawaban:
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 DiketahuiSeperti 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.
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
.
$ 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.
java -d32 -version
untuk memverifikasi bahwa Anda tidak menjalankan 32-bit. Keduanya ingin bekerja Win7
.
java -d32 -version
dan juga dari java -d64 -version
.
Ketikkan saja java -version
konsol 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 Client
alih-alih 64-Bit Server
di baris ketiga. Bagian Client/Server
itu tidak relevan, tidak adanya 64-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.
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.
os.arch
memiliki banyak nilai yang mungkin, sulit untuk mengetahui apakah itu 32 atau 64 bit. Lihat lopica.sourceforge.net/os.html
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. "
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
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).
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 ").
Sebab Windows
, Anda bisa mengecek Java
lokasi rumah. Jika mengandung (x86)
itu 32-bit
sebaliknya 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
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.
Untuk mendapatkan versi JVM saat ini menjalankan program
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
atau null
aktif Java 10
dan tetap tidak menjawab pertanyaan.