Проверете дали 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.