Рубрики
Без рубрики

Проверьте, работает ли Java-программа в 64-битной или 32-битной JVM

Узнайте, как java-программа может определить, работает ли она в 64-битной или 32-битной JVM.

Автор оригинала: baeldung.

Проверьте, работает ли Java-программа в 64-битной или 32-битной JVM

1. Обзор

Хотя Java независима от платформы, иногда мы должны использовать родные библиотеки. В этих случаях нам может потребоваться определить базовую платформу и загрузить соответствующие родные библиотеки на запуск.

В этом учебнике мы узнаем различные способы проверки того, работает ли программа Java на 64-битной или 32-битной JVM.

Во-первых, мы покажем, как этого достичь с помощью Системный класс.

Затем мы увидим, как использовать Java Родные доступ (JNA) Я. API для проверки битности JVM. JNA является общинной библиотекой, которая позволяет всем родным доступом.

2. Использование свойства системы sun.arch.data.model

Системный класс в Java обеспечивает доступ к внешне определенным свойствам и переменным среды. Он поддерживает Недвижимость объект, описывая конфигурацию текущей рабочей среды.

Мы можем использовать ” sun.arch.data.model ” системное свойство для идентификации bitness JVM:

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

Он содержит “32” или “64”, чтобы указать 32-битный или 64-битный СПМ, соответственно. Хотя этот подход прост в использовании, он возвращает “неизвестный”, если свойство не присутствует. Следовательно, он будет работать только с версиями 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. Использование API JNA

JNA ( Java Родные доступ ) поддерживает различные платформы, такие как 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. Класс платформы

Кроме того, мы можем использовать Платформа класса, который предоставляет упрощенную информацию о платформе.

Содержит is64Bit() метод, который определяет, является ли СПМ 64-битной или .

Давайте посмотрим, как он определяет bitness:

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

Вот, АРХ константа происходит от « os.arch ” собственность через Системный класс. Он используется для архитектуры операционной системы:

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

Этот подход работает для различных операционных систем, а также с различными поставщиками JDK. Следовательно, он надежнее, чем « sun.arch.data.model ” системное свойство.

4. Заключение

В этом учебнике мы узнали, как проверить версию бита JVM. Мы также наблюдали, как JNA упростила решение для нас на разных платформах.

Как всегда, полный код доступен более на GitHub .