programing

64비트 JVM 또는 32비트 JVM(프로그램 내에서)에서 실행 중인지 확인하려면 어떻게 해야 합니까?

firstcheck 2022. 8. 3. 21:05
반응형

64비트 JVM 또는 32비트 JVM(프로그램 내에서)에서 실행 중인지 확인하려면 어떻게 해야 합니까?

애플리케이션이 실행되고 있는 JVM이 32비트인지 64비트인지 확인하려면 어떻게 해야 합니까?프로그램 내에서 이를 검출하기 위해 구체적으로 어떤 기능이나 속성을 사용할 수 있습니까?

의에서는, 으로부터, 의 플래그를 사용해 의 할 수 .-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.

이러한 플래그는 Java 7에서 추가되었고 Java 9에서 사용되지 않으며 Java 10에서 제거되었으며 최신 버전의 Java에서는 더 이상 사용할 수 없습니다.

다음을 사용하여 이 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비트 버전 중 어느 쪽을 로드할지 결정해야 합니다.

냥냥 just just just just라고 치면 돼요.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)

: ★Client64-Bit ServerClient/Server 부분은 그것은, 그 부재입니다.64-Bit그게 중요해요.

되어 있는 하여 "Java" "Java" "Java" "/bin" "Java" 라고 입력합니다.java -versioncontract.discontracts.

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

보충 정보:

실행 중인 프로세스에서는 (최소한 최신 Sun 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: ELF 64비트 LSB 실행 파일, AMD x86-64, 버전 1(SYSV), GNU/Linux 2.4.0의 경우 동적으로 링크(공유 lib 사용), GNU/Linux 2.4.0의 경우 제거되지 않음

또는

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

o/p: 클래스: ELF64

만약 당신이 유고 인민군을 사용한다면, 당신은 이 지역 주민들을com.sun.jna.Native.POINTER_SIZE == 4(32비트) 또는com.sun.jna.Native.POINTER_SIZE == 8(64비트).

만약 당신이 유고 인민군을 사용하고 있다면, 당신은 이것을 할 수 있다.Platform.is64Bit().

이것이 유고 인민군이 이 문제를 해결하는 방법이다.Platform.is64Bit()(https://github.com/java-native-access/jna/blob/master/src/com/sun/jna/Platform.java)

 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 = getCanonicalArchitecture(System.getProperty("os.arch"), osType);

static String getCanonicalArchitecture(String arch, int platform) {
        arch = arch.toLowerCase().trim();
        if ("powerpc".equals(arch)) {
            arch = "ppc";
        }
        else if ("powerpc64".equals(arch)) {
            arch = "ppc64";
        }
        else if ("i386".equals(arch) || "i686".equals(arch)) {
            arch = "x86";
        }
        else if ("x86_64".equals(arch) || "amd64".equals(arch)) {
            arch = "x86-64";
        }
        // Work around OpenJDK mis-reporting os.arch
        // https://bugs.openjdk.java.net/browse/JDK-8073139
        if ("ppc64".equals(arch) && "little".equals(System.getProperty("sun.cpu.endian"))) {
            arch = "ppc64le";
        }
        // Map arm to armel if the binary is running as softfloat build
        if("arm".equals(arch) && platform == Platform.LINUX && isSoftFloat()) {
            arch = "armel";
        }

        return arch;
    }

static {
        String osName = System.getProperty("os.name");
        if (osName.startsWith("Linux")) {
            if ("dalvik".equals(System.getProperty("java.vm.name").toLowerCase())) {
                osType = ANDROID;
                // Native libraries on android must be bundled with the APK
                System.setProperty("jna.nounpack", "true");
            }
            else {
                osType = LINUX;
            }
        }
        else if (osName.startsWith("AIX")) {
            osType = AIX;
        }
        else if (osName.startsWith("Mac") || osName.startsWith("Darwin")) {
            osType = MAC;
        }
        else if (osName.startsWith("Windows CE")) {
            osType = WINDOWSCE;
        }
        else if (osName.startsWith("Windows")) {
            osType = WINDOWS;
        }
        else if (osName.startsWith("Solaris") || osName.startsWith("SunOS")) {
            osType = SOLARIS;
        }
        else if (osName.startsWith("FreeBSD")) {
            osType = FREEBSD;
        }
        else if (osName.startsWith("OpenBSD")) {
            osType = OPENBSD;
        }
        else if (osName.equalsIgnoreCase("gnu")) {
            osType = GNU;
        }
        else if (osName.equalsIgnoreCase("gnu/kfreebsd")) {
            osType = KFREEBSD;
        }
        else if (osName.equalsIgnoreCase("netbsd")) {
            osType = NETBSD;
        }
        else {
            osType = UNSPECIFIED;
        }
}

Windows 7 의 「컨트롤 패널」의 「프로그램 | 프로그램 및 기능」아래에, 64 비트의 JRE 및 JDK 는 괄호내에 「64 비트」(를 들면 「Java SE Development Kit 7 Update 65(64 비트)」)가 기재되어 있습니다만, 32 비트의 경우는, 괄호내에 기재되어 있지 않습니다.

현재 프로그램을 실행 중인 JVM 버전을 가져오려면

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

위해서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플랫폼에 의존하지 않아도 됩니다.

언급URL : https://stackoverflow.com/questions/2062020/how-can-i-tell-if-im-running-in-64-bit-jvm-or-32-bit-jvm-from-within-a-program

반응형