Перевірте, чи працює програма Java у 64-розрядному або 32-розрядному JVM

1. Огляд

Хоча Java не залежить від платформи, бувають випадки, коли нам доводиться використовувати власні бібліотеки. У цих випадках нам може знадобитися визначити базову платформу та завантажити відповідні власні бібліотеки під час запуску.

У цьому посібнику ми вивчимо різні способи перевірити, чи працює програма Java на 64-розрядному або 32-розрядному JVM.

Спочатку ми покажемо, як цього досягти, використовуючи клас System .

Потім ми побачимо, як використовувати API Java Native Access (JNA) для перевірки розрядності JVM. JNA - це бібліотека, розроблена спільнотою, яка надає доступ до всіх.

2. Використання властивості системи sun.arch.data.model

Клас System у Java забезпечує доступ до зовнішніх властивостей та змінних середовища. Він підтримує об'єкт Properties, який описує конфігурацію поточного робочого середовища.

Ми можемо використовувати системну властивість “ sun.arch.data.model ”, щоб визначити розрядність JVM:

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

Він містить “32” або “64” для позначення 32-розрядної або 64-розрядної JVM відповідно. Хоча цей підхід простий у використанні, він повертає значення "невідомо", якщо властивості немає. Отже, він буде працювати лише з версіями Oracle Java.

Давайте подивимось код:

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

Давайте перевіримо цей підхід за допомогою модульного тесту:

@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. Використання JNA API

JNA (Java Native Access) підтримує різні платформи, такі як macOS, Microsoft Windows, Solaris, GNU та Linux.

Він використовує власні функції для завантаження бібліотеки за іменем та отримання вказівника на функцію в цій бібліотеці.

3.1. Рідний клас

Ми можемо використовувати POINTER_SIZE з рідного класу. Ця константа визначає розмір (у байтах) власного вказівника на поточній платформі.

Значення 4 вказує на 32-розрядний власний вказівник, тоді як значення 8 вказує на 64-розрядний власний вказівник:

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

3.2. Клас платформи

Крім того, ми можемо використовувати клас Platform , який надає спрощену інформацію про платформу.

Вона містить в is64Bit () метод , який визначає , є чи в JVM є 64-розрядним чи ні .

Давайте подивимося, як це визначає розрядність:

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; }

Тут константа ARCH виводиться із властивостіos.arch ” через клас System . Він використовується для отримання архітектури операційної системи:

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

Цей підхід працює для різних операційних систем, а також для різних постачальників JDK. Отже, він надійніший, ніж властивість системи “ sun.arch.data.model ”.

4. Висновок

У цьому підручнику ми дізналися, як перевірити бітову версію JVM. Ми також спостерігали, як JNA спрощувала рішення для нас на різних платформах.

Як завжди, повний код доступний на GitHub.