Periksa sama ada Program Java Berjalan dalam JVM 64-Bit atau 32-Bit

1. Gambaran keseluruhan

Walaupun Java tidak bergantung pada platform, ada kalanya kita harus menggunakan perpustakaan asli. Dalam kes tersebut, kita mungkin perlu mengenal pasti platform yang mendasari dan memuatkan perpustakaan asli yang sesuai pada permulaan.

Dalam tutorial ini, kita akan mempelajari pelbagai cara untuk memeriksa apakah program Java dijalankan pada JVM 64-bit atau 32-bit.

Pertama, kami akan menunjukkan bagaimana mencapainya menggunakan kelas Sistem .

Kemudian, kita akan melihat bagaimana menggunakan Java Native Access (JNA) API untuk memeriksa kesaksian JVM. JNA adalah perpustakaan yang dikembangkan oleh masyarakat yang membolehkan semua akses asli.

2. Menggunakan Harta Sistem sun.arch.data.model

The Sistem kelas di Jawa menyediakan akses kepada sifat yang ditakrifkan secara luaran dan pemboleh ubah persekitaran. Ia mengekalkan objek Properties yang menerangkan konfigurasi persekitaran kerja semasa.

Kita boleh menggunakan sifat sistem " sun.arch.data.model " untuk mengenal pasti saksi JVM:

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

Ini berisi "32" atau "64" untuk menunjukkan JVM 32-bit atau 64-bit, masing-masing. Walaupun pendekatan ini mudah digunakan, ia mengembalikan "tidak diketahui" jika harta itu tidak ada. Oleh itu, ia hanya akan berfungsi dengan versi Oracle Java.

Mari lihat kodnya:

public class JVMBitVersion { public String getUsingSystemClass() { return System.getProperty("sun.arch.data.model") + "-bit"; } //... other methods } 

Mari periksa pendekatan ini melalui ujian unit:

@Test public void whenUsingSystemClass_thenOutputIsAsExpected() { if ("64".equals(System.getProperty("sun.arch.data.model"))) { assertEquals("64-bit", jvmVersion.getUsingSystemClass()); } else if ("32".equals(System.getProperty("sun.arch.data.model"))) { assertEquals("32-bit", jvmVersion.getUsingSystemClass()); } }

3. Menggunakan JNA API

JNA (Java Native Access) menyokong pelbagai platform seperti macOS, Microsoft Windows, Solaris, GNU, dan Linux.

Ini menggunakan fungsi asli untuk memuatkan perpustakaan dengan nama dan mengambil penunjuk ke fungsi dalam perpustakaan itu.

3.1. Kelas Anak Negeri

Kita boleh menggunakan POINTER_SIZE dari kelas Asli . Pemalar ini menentukan ukuran (dalam bait) penunjuk asli pada platform semasa.

Nilai 4 menunjukkan penunjuk asli 32-bit, sementara nilai 8 menunjukkan penunjuk asli 64-bit:

if (com.sun.jna.Native.POINTER_SIZE == 4) { // 32-bit } else if (com.sun.jna.Native.POINTER_SIZE == 8) { // 64-bit }

3.2. Kelas Platform

Sebagai alternatif, kita boleh menggunakan kelas Platform , yang menyediakan maklumat platform yang dipermudahkan.

Ia mengandungi kaedah is64Bit () yang mengesan sama ada JVM 64-bit atau tidak .

Mari lihat bagaimana ia mengenal pasti saksi:

public static final boolean is64Bit() { String model = System.getProperty("sun.arch.data.model", System.getProperty("com.ibm.vm.bitmode")); if (model != null) { return "64".equals(model); } if ("x86-64".equals(ARCH) || "ia64".equals(ARCH) || "ppc64".equals(ARCH) || "ppc64le".equals(ARCH) || "sparcv9".equals(ARCH) || "mips64".equals(ARCH) || "mips64el".equals(ARCH) || "amd64".equals(ARCH) || "aarch64".equals(ARCH)) { return true; } return Native.POINTER_SIZE == 8; }

Di sini, pemalar ARCH berasal dari sifat " os.arch " melalui kelas Sistem . Ia digunakan untuk mendapatkan seni bina sistem operasi:

ARCH = getCanonicalArchitecture(System.getProperty("os.arch"), osType);

Pendekatan ini berfungsi untuk sistem operasi yang berbeza dan juga dengan vendor JDK yang berbeza. Oleh itu, ia lebih dipercayai daripada sifat sistem " sun.arch.data.model ".

4. Kesimpulan

Dalam tutorial ini, kami belajar bagaimana memeriksa versi bit JVM. Kami juga memerhatikan bagaimana JNA mempermudah penyelesaian untuk kami di pelbagai platform.

Seperti biasa, kod lengkap boleh didapati di GitHub.