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가 다양한 플랫폼에서 솔루션을 단순화한 방법도 관찰했습니다.