Перейти к основному содержимому

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

· 3 мин. чтения

Упражнение: Сложение двух чисел

Даны два неотрицательный целых числа в виде непустых связных списков. Их цифры хранятся в обратном порядке. И каждый елемент списка содержить ровно одну цифру. Сложите эти два числа и верните сумму в виде связного списка ...

ANDROMEDA

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 из класса Native . Эта константа указывает размер (в байтах) собственного указателя на текущей платформе.

Значение 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 .