views:

731

answers:

4

How do you determine 32 or 64 bit architecture of Windows using Java?

Thanks.

+2  A: 
System.getProperty("os.arch");
Bozho
On 64b windows, but 32b jvm it prints "x86" for me. So I guess it doesn't say the version of system but rather virtual machine.
Luno
yes, that's a popular 'gotcha'.
Bozho
A: 

You can use the os.arch property in system properties to find out.

Properties pr = System.getProperties();
System.out.println(pr.getProperty("os.arch"));

If you are on 32 bit, it should show i386 or something

pvsnp
it will be 'x86'
Bozho
Thanks, I was using it on my Linux box, which showed i386.
pvsnp
+2  A: 

Please note, the os.arch property will only give you the architecture of the JRE, not of the underlying os.

If you install a 32 bit jre on a 64 bit system, System.getProperty("os.arch") will return x86

In order to actually determine the underlying architecture, you will need to write some native code. See this post for more info (and a link to sample native code)

James Van Huis
A: 

I don't exactly trust reading the os.arch system variable. While it works if a user is running a 64bit JVM on a 64bit system. It doesn't work if the user is running a 32bit JVM on a 64 bit system.

The following code works for properly detecting Windows 64-bit operating systems. On a Windows 64 bit system the environment variable "Programfiles(x86)" will be set. It will NOT be set on a 32-bit system and java will read it as null.

boolean is64bit = false;
if (System.getProperty("os.name").contains("Windows")) {
    is64bit = (System.getenv("ProgramFiles(x86)") != null);
} else {
    is64bit = (System.getProperty("os.arch").indexOf("64") != -1);
}

For other operating systems like Linux or Solaris or Mac we may see this problem as well. So this isn't a complete solution. For mac you are probably safe because apple locks down the JVM to match the OS. But Linux and Solaris, etc.. they may still use a 32-bit JVM on their 64-bit system. So use this with caution.

Boolean