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

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


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.


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)


I used the command prompt (command --> wmic OS get OSArchitecture) to get the OS architecture. The following program helps get all the required parameters:

import java.io.*;public class User {    public static void main(String[] args) throws Exception {        System.out.println("OS --> "+System.getProperty("os.name"));   //OS Name such as Windows/Linux        System.out.println("JRE Architecture --> "+System.getProperty("sun.arch.data.model")+" bit.");       // JRE architecture i.e 64 bit or 32 bit JRE        ProcessBuilder builder = new ProcessBuilder(            "cmd.exe", "/c","wmic OS get OSArchitecture");        builder.redirectErrorStream(true);        Process p = builder.start();        String result = getStringFromInputStream(p.getInputStream());        if(result.contains("64"))            System.out.println("OS Architecture --> is 64 bit");  //The OS Architecture        else            System.out.println("OS Architecture --> is 32 bit");        }    private static String getStringFromInputStream(InputStream is) {        BufferedReader br = null;        StringBuilder sb = new StringBuilder();        String line;        try {            br = new BufferedReader(new InputStreamReader(is));            while ((line = br.readLine()) != null) {                sb.append(line);            }        } catch (IOException e) {            e.printStackTrace();        } finally {            if (br != null) {                try {                    br.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return sb.toString();    }}