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


563

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


3
호기심 때문에 시스템의 자연스러운 크기를 알아야하는 이유는 무엇입니까? 이와 같은 세부 사항은 Java로 추상화되어 있으므로 이론 상으로는 알 필요가 없습니다.
Patrick Niedzielski

3
포인터로 인해 객체의 메모리 요구 사항을 대략적으로 추정 할 수 있습니다. 호기심도-방법이 있어야하는 것처럼 보였지만 결코 들어 보지 못했습니다.
BobMcGee

85
이 "세부 사항"은 Java Native Interface와 상호 작용할 때 추상화되지 않습니다. 32 비트 DLL은 64 비트 JVM과 함께로드 할 수 없으며 그 반대도 마찬가지입니다. 따라서 이것은 JNI를 사용하는 사람에게는 매우 중요한 정보입니다. 이 정보를 얻을 수있는 휴대용 방법이없는 것 같습니다. 한 가지 방법은 먼저 32 비트 버전의 DLL을로드하고, 실패하면 64 비트 버전 등을 시도하는 것입니다.
Joonas Pulakka

12
32 비트 또는 64 비트 JVM간에 식별이 중요한 다른 상황은 맵핑 된 파일입니다. 32 비트 시스템에서는 2GB 만 맵핑 할 수 있으므로이 한계를 초과하지 않도록 파일 세그먼트를 맵핑하고 맵핑 해제하는 것이 중요하지만 64 비트 jvm에서는 한계가 훨씬 더 높습니다.
Simone Gianni

2
문제의 머신에서 가장 빠른 수치 알고리즘을 선택할 수 있다는 것이 정말 좋습니다.
dfeuer

답변:


317

이 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 비트 버전의 라이브러리를로드할지 여부를 결정해야하는 경우가 필요할 수 있습니다.


22
sun.*IBM JVM으로 시스템 특성 을 찾을 것으로 기대하지 않습니다 . 다시 말해, 이식성이 없습니다.
Pascal Thivent

8
명령 줄에서 어떻게 알 수 있습니까? 32 비트 또는 64 비트를 실행중인 경우? 그냥 궁금해서
Xonatron

17
허용되는 답변은 왜 Sun에 의존합니까? "os.arch"는 독점적 인 썬 패키지를 사용하지 않고도 동일한 작업을 수행합니다.
b1nary.atr0phy

7
@ b1naryatr0phy, os.arch가 운영 체제 또는 JVM에 대해보고합니까? 개발 목적으로 종종 64 비트 워크 스테이션에서 32 비트 JVM을 실행합니다.
skiphoppy

7
이 특성은 IBM JVM에서 지원되지만 GCJ에서는 지원되지 않습니다. 참조 stackoverflow.com/questions/807263/...
엠마뉴엘 부르

707

자바의 특정 버전의 경우, 플래그 명령 줄에서 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)에, 그리고 자바의 현대 버전에서 더 이상 사용할 수.


3
이것은 알기는하지만 프로그램 외부에서 실행하거나 java 옵션을 사용하여 새 프로세스를 시작 해야하는 것은 유용하지 않습니다.
BobMcGee

13
정확히 내가 찾던 것. 그리고 java -d32 -version32 비트를 실행하고 있지 않은지 확인하기 위해 실행할 수 있습니다 . 둘 다에 노력하고 Win7있습니다.
Xonatron

31
나는 윈도우 7에 오전, 난에서 '알 수없는 옵션'오류 java -d32 -version 도에서 java -d64 -version .
ely

40
"-D64"를 사용하지 마십시오. 완전히 다른 것입니다. "64"라는 시스템 속성을 정의합니다. 이것은 분명히 여기서 원하는 것이 아닙니다.
Jonathan Headland

9
-d32 또는 -d64 플래그는 Java 7 이상에서만 작동합니다.
darrenmc

187

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여기에 입력하십시오 .


그러나 hp 논스톱 oss env에서는 64 비트 또는 32 비트를
얻지 못합니다

28
OP는 구체적으로 프로그램 내에서 말합니다 .
Tomáš Zato-복권 모니카

34

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 비트) 모두에 대해 테스트되었습니다. 분명히 시스템 속성은 운영 체제 아치가 아닙니다.


7
운영 체제 아키텍처 정보를 제공합니다. 내가 틀리지 않으면 이것은 JVM bitness와 같을 필요는 없습니다.
codaddict

2
@ codaddict, 실제로 JVM bitness 인 것 같습니다.
bryantsai

20
@codaddict 그것은 완전히 거짓입니다 (그리고 왜 6 명의 ppl이 그 의견에 투표했는지 모르겠습니다.) "os.arch"는 JVM 버전을 반환하도록 설계되었습니다. 직접 테스트하고 OS 감지에 실제로 의존하고 있다면 신이 도와줍니다.
b1nary.atr0phy

6
os.arch가능한 값이 많으므로 32 비트인지 64 비트인지 구분하기가 어렵습니다. lopica.sourceforge.net/os.html
Emmanuel Bourg

2
이것은 인간의 눈을위한 문자열이며 유효한 값을 엄격하게 정의하지 않고, 이것에 의존하는 것은 좋은 생각이 아닙니다. 대신 실제 기능을 검사하는 코드를 작성하십시오.
Thorbjørn Ravn Andersen

15

보완 정보 :

실행중인 프로세스 는 (최근의 일 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의 위치 또는 크래시 덤프 파일이 생성 된 위치를 포함해야합니다. "


7

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


6

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


이것은 영리하지만 포인터 크기에 액세스하는 것은 여기의 다른 솔루션보다 상당히 느립니다 (초기화하는 데 시간이 필요합니다).
BullyWiiPlaza

1

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


1

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


-1

의 경우 집 위치를 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플랫폼 독립성이 어쨌든 네이티브 코드를 사용하고있을 가능성이 높습니다 .


-2

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

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

JVM 또는 운영 체제에 대한 보고서입니까? 64 비트 운영 체제에서 32 비트 JVM을 실행할 수 있습니다.
Thorbjørn Ravn Andersen

JMX를 사용하지 않습니까?
Thorbjørn Ravn Andersen

2
같은이 반환 뭔가 1.8.0_172nullJava 10와 어쨌든 질문에 대답하지 않습니다.
BullyWiiPlaza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.