How can I tell if the JVM in which my application runs is 32 bit or 64-bit? Specifically, what functions or properties I can used to detect this within the program?
You retrieve the system property that marks the bitness of this JVM with:
System.getProperty("sun.arch.data.model");
Possible results are:
"32"
– 32-bit JVM"64"
– 64-bit JVM"unknown"
– Unknown JVM
As described in the HotSpot FAQ:
When writing Java code, how do I distinguish between 32 and 64-bit operation?
There's no public API that allows you to distinguish between 32 and 64-bit operation. Think of 64-bit as just another platform in the write once, run anywhere tradition. However, if you'd like to write code which is platform specific (shame on you), the system property sun.arch.data.model has the value "32", "64", or "unknown".
An example where this could be necessary is if your Java code depends on native libraries, and you need to determine whether to load the 32- or 64-bit version of the libraries on startup.
sun.*
system properties with an IBM JVM. In other words, it's not portable. –
Nonrecognition For certain versions of Java, you can check the bitness of the JVM from the command line with the flags -d32
and -d64
.
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
To check for a 64-bit JVM, run:
$ java -d64 -version
If it's not a 64-bit JVM, you'll get this:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
Similarly, to check for a 32-bit JVM, run:
$ java -d32 -version
If it's not a 32-bit JVM, you'll get this:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
These flags were added in Java 7, deprecated in Java 9, removed in Java 10, and no longer available on modern versions of Java.
java -d32 -version
to verify you are not running 32-bit. Both wish work on Win7
. –
Dying java -d32 -version
and also from java -d64 -version
. –
Deictic java -d64
. –
Wilfredowilfrid java -d32
, it detects error of not supported. But, if you run java -d64
, it complains about missing parameters and -version
is needed. –
Badman java -d64 -version
returned with exit code 0. –
Mizzen You retrieve the system property that marks the bitness of this JVM with:
System.getProperty("sun.arch.data.model");
Possible results are:
"32"
– 32-bit JVM"64"
– 64-bit JVM"unknown"
– Unknown JVM
As described in the HotSpot FAQ:
When writing Java code, how do I distinguish between 32 and 64-bit operation?
There's no public API that allows you to distinguish between 32 and 64-bit operation. Think of 64-bit as just another platform in the write once, run anywhere tradition. However, if you'd like to write code which is platform specific (shame on you), the system property sun.arch.data.model has the value "32", "64", or "unknown".
An example where this could be necessary is if your Java code depends on native libraries, and you need to determine whether to load the 32- or 64-bit version of the libraries on startup.
sun.*
system properties with an IBM JVM. In other words, it's not portable. –
Nonrecognition Just type java -version
in your console.
If a 64 bit version is running, you'll get a message like:
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)
A 32 bit version will show something similar to:
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)
Note Client
instead of 64-Bit Server
in the third line. The Client/Server
part is irrelevant, it's the absence of the 64-Bit
that matters.
If multiple Java versions are installed on your system, navigate to the /bin folder of the Java version you want to check, and type java -version
there.
I installed 32-bit JVM and retried it again, looks like the following does tell you JVM bitness, not OS arch:
System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM
This was tested against both SUN and IBM JVM (32 and 64-bit). Clearly, the system property is not just the operating system arch.
os.arch
has many possible values, it's difficult to tell if it's 32 or 64 bits. See lopica.sourceforge.net/os.html –
Therapist Complementary info:
On a running process you may use (at least with some recent Sun JDK5/6 versions):
$ /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
where 14680 is PID of jvm running the application. "os.arch" works too.
Also other scenarios are supported:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
However consider also this note:
"NOTE - This utility is unsupported and may or may not be available in future versions of the JDK. In Windows Systems where dbgent.dll is not present, 'Debugging Tools for Windows' needs to be installed to have these tools working. Also the PATH environment variable should contain the location of jvm.dll used by the target process or the location from which the Crash Dump file was produced."
On Linux, you can get ELF header information by using either of the following two commands:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o/p: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), for GNU/Linux 2.4.0, not stripped
or
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'
o/p: Class: ELF64
If you are using JNA, you can check whether com.sun.jna.Native.POINTER_SIZE == 4
(32 bit) or com.sun.jna.Native.POINTER_SIZE == 8
(64 bit).
If you're using JNA, you can do this
Platform.is64Bit()
This is the way JNA solves this with 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;
}
}
You can use a JNI library. This will always work and is independent of the running JVM brand.
Java code:
package org.mytest;
public class NativeBinding
{
public static native int getRegisterWidth(); // returns 32 or 64
}
And this is the C code:
#include <jni.h>
// will return register width (32 or 64)
extern "C" JNIEXPORT jint JNICALL
Java_org_mytest_NativeBinding_getRegisterWidth(JNIEnv*, jclass)
{
return sizeof(void*) * 8;
}
Under Windows 7 in the "Control Panel" under "Programs | Programs and Features" the 64-bit variants of JRE & JDK are listed with "64-bit" in parentheses (e.g. "Java SE Development Kit 7 Update 65 (64-Bit)"), while for the 32-bit variants the variant is not mentioned in parentheses (e.g. just "Java SE Development Kit 8 Update 60").
To get the version of JVM currently running the program
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
or null
on Java 10
and doesn't answer the question anyway. –
Burgin For Windows
, you can check the Java
home location. If it contains (x86)
it is 32-bit
otherwise 64-bit
:
public static boolean is32Bit()
{
val javaHome = System.getProperty("java.home");
return javaHome.contains("(x86)");
}
public static boolean is64Bit()
{
return !is32Bit();
}
Example paths:
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
Why care about a Windows
only solution?
If you need to know which bit version you're running on, you're likely fiddling around with native code on Windows
so platform-independence is out of the window anyway.
java
or javac
utility and see if certain 32-Bit
exclusive command line switches work or the java -version
output includes something like 64-Bit
–
Burgin © 2022 - 2024 — McMap. All rights reserved.