Hoe weet ik of ik in 64-bits JVM of 32-bits JVM (vanuit een programma) gebruik?

Hoe weet ik of de JVM waarin mijn applicatie draait 32-bits of 64-bits is? Welke functies of eigenschappen kan ik specifiek gebruiken om dit binnen het programma te detecteren?


Antwoord 1, autoriteit 100%

Je haalt de systeemeigenschapop die de bitness van deze JVM met:

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

Mogelijke resultaten zijn:

  • "32"– 32-bits JVM
  • "64"– 64-bits JVM
  • "unknown"– Onbekende JVM

Zoals beschreven in de Veelgestelde vragen over HotSpot:

Hoe onderscheid ik bij het schrijven van Java-code tussen 32- en 64-bits bewerkingen?

Er is geen openbare API waarmee u onderscheid kunt maken tussen 32- en 64-bits bewerkingen. Zie 64-bit als gewoon een ander platform in de traditie van schrijven, overal uitvoeren. Als u echter code wilt schrijven die platformspecifiek is (shame on you), heeft de systeemeigenschap sun.arch.data.model de waarde “32”, “64” of “unknown”.

Een voorbeeld waar dit nodig kan zijn, is als uw Java-code afhankelijk is van native bibliotheken en u moet bepalen of u de 32- of 64-bits versie van de bibliotheken wilt laden bij het opstarten.


Antwoord 2, autoriteit 95%

Voor bepaalde versies van Java kunt u de bitness van de JVM controleren vanaf de opdrachtregel met de vlaggen -d32en -d64.

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

Als u wilt controleren op een 64-bits JVM, voert u het volgende uit:

$ java -d64 -version

Als het geen 64-bits JVM is, krijg je dit:

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

Op dezelfde manier, om te controleren op een 32-bits JVM, voer je uit:

$ java -d32 -version

Als het geen 32-bits JVM is, krijg je dit:

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

Deze vlaggen zijn toegevoegd in Java 7, verouderdin Java 9 , verwijderdin Java 10 en niet langer beschikbaar in moderne versies van Java .


Antwoord 3, autoriteit 59%

Typ gewoon java -versionin je console.

Als een 64-bits versie actief is, krijg je een bericht als:

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)

Een 32-bits versie toont iets dat lijkt op:

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)

Let op Clientin plaats van 64-Bit Serverin de derde regel. Het Client/Server-gedeelte is niet relevant, het is de afwezigheid van de 64-Bitdie ertoe doet.

Als er meerdere Java-versies op uw systeem zijn geïnstalleerd, navigeert u naar de map /bin van de Java-versie die u wilt controleren en typt u daar java -version.


Antwoord 4, autoriteit 11%

Ik heb 32-bits JVM geïnstalleerd en het opnieuw geprobeerd, het lijkt erop dat het volgende je JVM-bitness vertelt, niet OS-arch:

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

Dit is getest tegen zowel SUN als IBM JVM (32 en 64-bit). Het is duidelijk dat de systeemeigenschap niet alleen de boog van het besturingssysteem is.


Antwoord 5, autoriteit 5%

Aanvullende informatie:

Op een lopend procesdat u kunt gebruiken (tenminste met enkele recente Sun JDK5/6-versies):

$ /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

waarbij 14680 de PID is van jvm die de toepassing uitvoert. “os.arch” werkt ook.

Ook andere scenario’s worden ondersteund:

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

Beschouw echter ook deze opmerking:

opmerking – Dit hulpprogramma wordt niet ondersteund en mag of mei Niet beschikbaar in toekomstige versies van de JDK. In Windows-systemen waar DbGent.dll niet aanwezig is, moeten ‘debuggende instrumenten voor Windows’ worden geïnstalleerd om deze tools te laten werken. Ook moet de padomgeving variabele de locatie van jvm.dll bevatten gebruikt door het doelproces of de locatie waaruit het dumpbestand van de crash is geproduceerd. “


Antwoord 6, Autoriteit 2%

Op Linux kunt u elf-header-informatie krijgen met behulp van een van de volgende twee opdrachten:

file {YOUR_JRE_LOCATION_HERE}/bin/java

O / P:
Elf 64-bit LSB uitvoerbaar , AMD X86-64, Versie 1 (SYSV), voor GNU / Linux 2.4.0, dynamisch gekoppeld (gebruikt Gedeelde Libs), voor GNU / Linux 2.4.0, niet gestript

of

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

O / P:
Klasse: Elf 64


Antwoord 7, Autoriteit 2%

Als u JNA gebruikt, kunt u controleren of com.sun.jna.Native.POINTER_SIZE == 4(32 bit) of com.sun.jna.Native.POINTER_SIZE == 8(64 bit).


Antwoord 8

Als u JNA gebruikt, kunt u dit doen Platform.is64Bit().


Antwoord 9

Dit is de manier waarop JNa dit oplost met 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;
        }
}

Antwoord 10

Onder Windows 7 in het “Configuratiescherm” onder “Programma’s | Programma’s en onderdelen” de 64-bits varianten van JRE & JDK wordt vermeld met “64-bits” tussen haakjes (bijv. “Java SE Development Kit 7 Update 65 (64-Bit)“), terwijl voor de 32-bits varianten de variant wordt niet tussen haakjes genoemd (bijvoorbeeld alleen “Java SE Development Kit 8 Update 60“).


Antwoord 11

Om de versie van JVM te krijgen die momenteel het programma uitvoert

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

Antwoord 12

Windows, kunt u de Javahome locatie te controleren. Al bevat (x86)is 32-bitanders 64-bit:

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

Voorbeeld paden:

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

Waarom de zorg over een Windowsenige oplossing?

Als u wilt weten welke bits versie je draait op, je bent waarschijnlijk prutsen met native code op Windows, zodat platform-onafhankelijkheid is uit het raam in ieder geval.

Other episodes