Programing

프로그램 내에서 64 비트 JVM 또는 32 비트 JVM에서 실행 중인지 어떻게 알 수 있습니까?

lottogame 2020. 2. 9. 20:27
반응형

프로그램 내에서 64 비트 JVM 또는 32 비트 JVM에서 실행 중인지 어떻게 알 수 있습니까?


애플리케이션이 실행되는 JVM이 32 비트인지 64 비트인지 어떻게 알 수 있습니까? 특히, 프로그램 내에서이를 감지하는 데 사용할 수있는 기능 또는 속성은 무엇입니까?


이 JVM의 비트를 표시 하는 시스템 특성검색하십시오 .

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

가능한 결과는 다음과 같습니다.

  • "32" – 32 비트 JVM
  • "64" – 64 비트 JVM
  • "unknown" – 알 수없는 JVM

HotSpot FAQ에 설명 된대로 :

Java 코드를 작성할 때 32 비트와 64 비트 작업을 어떻게 구별합니까?

32 비트와 64 비트 작업을 구별 할 수있는 공개 API는 없습니다. 64 비트는 한 번만 쓸 수있는 또 다른 플랫폼으로 생각하십시오. 그러나 플랫폼 고유의 코드를 작성하려면 (부끄러운 일) 시스템 속성 sun.arch.data.model의 값은 "32", "64"또는 "unknown"입니다.

Java 코드가 기본 라이브러리에 의존하고 시작시 32 비트 또는 64 비트 버전의 라이브러리를로드할지 여부를 결정해야하는 경우가 필요할 수 있습니다.


자바의 특정 버전의 경우, 플래그 명령 줄에서 JVM의 비트 수를 확인할 수 있습니다 -d32-d64.

$ java -help
...
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available

64 비트 JVM을 확인하려면 다음을 실행하십시오.

$ java -d64 -version

64 비트 JVM이 아닌 경우 다음을 얻을 수 있습니다.

Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.

마찬가지로 32 비트 JVM을 확인하려면 다음을 실행하십시오.

$ java -d32 -version

32 비트 JVM이 아닌 경우 다음을 얻을 수 있습니다.

Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.

이러한 플래그는 자바 7에 추가 된 사용되지 않습니다 , 자바 9 제거 자바 (10)에, 그리고 자바의 현대 버전에서 더 이상 사용할 수.


java -version콘솔에 입력 하십시오.

64 비트 버전이 실행중인 경우 다음과 같은 메시지가 표시됩니다.

java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)

32 비트 버전은 다음과 비슷한 내용을 보여줍니다.

java version "1.6.0_41"
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)

세 번째 줄 Client대신에 메모하십시오 64-Bit Server. Client/Server부분은 관련이 없습니다 . 중요한 것은 없습니다 64-Bit.

시스템에 여러 Java 버전이 설치된 경우 확인하려는 Java 버전의 / bin 폴더로 이동 한 후 java -version여기에 입력하십시오 .


32 비트 JVM을 설치하고 다시 시도했는데 다음은 OS 아치가 아닌 JVM 비트임을 나타냅니다.

System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM

이것은 SUN 및 IBM JVM (32 및 64 비트) 모두에 대해 테스트되었습니다. 분명히 시스템 속성은 운영 체제 아치가 아닙니다.


보완 정보 :

A의 실행중인 프로세스 는 (최근의 일 JDK5 / 6 버전 이상에서) 사용할 수 있습니다 :

$ /opt/java1.5/bin/jinfo -sysprops 14680 | grep sun.arch.data.model
Attaching to process ID 14680, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_16-b02
sun.arch.data.model = 32

여기서 14680은 응용 프로그램을 실행하는 jvm의 PID입니다. "os.arch"도 작동합니다.

다른 시나리오도 지원됩니다.

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 

그러나이 참고 사항도 고려하십시오.

" 참고 -이 유틸리티는 지원되지 않으며 향후 버전의 JDK에서 사용하지 못할 수도 있습니다. dbgent.dll이없는 Windows 시스템에서는 이러한 도구가 작동하려면 'Windows 용 디버깅 도구'를 설치해야합니다. PATH 환경 변수는 대상 프로세스가 사용하는 jvm.dll의 위치 또는 크래시 덤프 파일이 생성 된 위치를 포함해야합니다. "


Linux에서는 다음 두 명령 중 하나를 사용하여 ELF 헤더 정보를 얻을 수 있습니다.

file {YOUR_JRE_LOCATION_HERE}/bin/java

o / p : GNU / Linux 2.4.0 용 ELF 64 비트 LSB 실행 파일 , AMD x86-64, 버전 1 (SYSV), 동적 링크 (공유 라이브러리 사용), GNU / Linux 2.4.0 용, 스트립되지 않음

또는

readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'

o / p : 클래스 : ELF 64


JNA를 사용하는 경우 com.sun.jna.Native.POINTER_SIZE == 4(32 비트) 또는 com.sun.jna.Native.POINTER_SIZE == 8(64 비트) 여부를 확인할 수 있습니다 .


" 프로그램 | 프로그램 및 기능 "아래 " 제어판 " 의 Windows 7에서 JRE 및 JDK의 64 비트 변형이 괄호 안에 " 64 비트 "로 표시됩니다 (예 : " Java SE Development Kit 7 Update 65 (64 비트) ) "), 32 비트 변형의 경우 변형은 괄호로 표시되지 않습니다 (예 :" Java SE Development Kit 8 Update 60 ").


의 경우 집 위치를 Windows확인할 수 Java있습니다. 가 포함되어있는 경우 (x86)가있다 32-bit그렇지 않으면 64-bit:

public static boolean is32Bit()
{
    val javaHome = System.getProperty("java.home");
    return javaHome.contains("(x86)");
}

public static boolean is64Bit()
{
    return !is32Bit();
}

경로 예 :

C:\Program Files (x86)\Java\jdk1.8.0_181\bin\java.exe # 32-bit
C:\Program Files\Java\jdk-10.0.2\bin\java.exe # 64-bit

Windows유일한 솔루션에 관심이 있습니까?

실행중인 비트 버전을 알아야하는 경우 Windows플랫폼 독립성이 어쨌든 네이티브 코드를 사용하고있을 가능성이 큽니다 .


JNA를 사용하는 경우이 작업을 수행 할 수 있습니다 Platform.is64Bit().


현재 프로그램을 실행중인 JVM 버전을 얻으려면

System.out.println(Runtime.class.getPackage().getImplementationVersion());

참고 : https://stackoverflow.com/questions/2062020/how-can-i-tell-if-im-running-in-64-bit-jvm-or-32-bit-jvm-from-within-a -프로그램



반응형