1. 개요

Java는 플랫폼에 독립적이지만 기본 라이브러리를 사용해야 하는 경우가 있습니다. 이러한 경우 기본 플랫폼을 식별하고 시작 시 적절한 기본 라이브러리를 로드해야 할 수 있습니다.

이 사용방법(예제)에서는 Java 프로그램이 64비트 또는 32비트 JVM에서 실행 중인지 확인하는 다양한 방법을 배웁니다.

먼저 System 클래스를 사용하여 이를 달성하는 방법을 보여줍니다 .

그런 다음 JNA( Java Native Access ) API를 사용하여 JVM의 비트 수를 확인하는 방법을 살펴보겠습니다 . JNA는 모든 기본 액세스를 가능하게 하는 커뮤니티 개발 라이브러리입니다.

2. sun.arch.data.model 시스템 속성 사용

Java System 클래스는 외부에서 정의된 속성 및 환경 변수에 대한 액세스를 제공합니다. 현재 작업 환경의 구성을 설명 하는 Properties 개체를 유지 관리 합니다.

" sun.arch.data.model " 시스템 속성을 사용하여 JVM 비트 수를 식별 할 수 있습니다 .

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

여기에는 각각 32비트 또는 64비트 JVM을 나타내는 "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. JNA API 사용

JNA( Java Native Access )는 macOS, Microsoft Windows, Solaris, GNU 및 Linux와 같은 다양한 플랫폼을 지원합니다.

네이티브 함수를 사용하여 이름으로 라이브러리를 로드하고 해당 라이브러리 내의 함수에 대한 포인터를 검색합니다.

3.1. 네이티브 클래스

Native 클래스 에서 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 클래스를 사용할 수 있습니다 .

JVM이 64비트인지 여부를 감지 하는 is64Bit() 메소드가 포함되어 있습니다 .

비트를 식별하는 방법을 살펴보겠습니다.

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 상수는 System 클래스 를 통해 " os.arch " 속성 에서 파생됩니다 . 운영 체제 아키텍처를 가져오는 데 사용됩니다.

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

이 접근 방식은 다양한 운영 체제 및 다양한 JDK 공급업체에서 작동합니다. 따라서 " sun.arch.data.model " 시스템 속성 보다 더 안정적 입니다.

4. 결론

이 예제에서는 JVM 비트 버전을 확인하는 방법을 배웠습니다. 또한 JNA가 다양한 플랫폼에서 솔루션을 단순화한 방법도 관찰했습니다.

항상 그렇듯이 전체 코드는 GitHub 에서 사용할 수 있습니다 .

Junit footer banner