检查当前JVM是64位还是32位

时间:2014-06-14 06:04:34

标签: java jvm 32bit-64bit

在对同一主题进行一些研究之后,我使用了方法" getVersion()"检查JVM是64位还是32位。

 public static String getVersion()
 {
   String version = System.getProperty("sun.arch.data.model");
   if (version != null && version.contains("64")){
       return "64";
   }else{
       return "32";
   }
 }

在某些情况下出错了。是的,因为标志名称提到,该方法显然是依赖于阳光的。我试图获得该物业" os.arch"也。但在某些情况下,它错误地识别JVM。 有没有更值得信赖的检查方式? 我的应用程序纯粹基于Windows。而且我不希望这种方法适用于任何其他平台。

3 个答案:

答案 0 :(得分:1)

您需要从这里获得2个jar文件: https://java.net/projects/jna/downloads/directory/3.3.0

代码编辑以修复IsWow64Process的评估)

import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.ptr.IntByReference;

public class Main {

    public static void main(String[] args) {
        System.out.println(is64BitJava());
    }

    private static boolean is64BitJava(){
        if (!is64BitWindows()){
            return false;
        }

        Kernel32 kernel32 = Kernel32.INSTANCE;
        WinNT.HANDLE handle = kernel32.GetCurrentProcess();
        if (!kernel32.IsWow64Process(handle, ref)){
            return false;
        }

        return ref.getValue() == 0;

    }

    private static boolean is64BitWindows(){
        String envVar = System.getenv("ProgramW6432");
        if (envVar == null){
            envVar = "";
        }

        return envVar.length() > 0;
    }

}

为了检查Windows是否为64位,我检查是否定义了ProgramW6432环境变量。

然后我使用Win32 API GetCurrentProcessIsWow64Process函数来检查当前的运行过程。

答案 1 :(得分:1)

这是一个纯Java解决方案,它检查将32位库链接到当前进程的能力:

static boolean is64bitProcess() {
    String wow64_kernel = System.getenv("systemroot") + "\\SysWOW64\\kernel32.dll";
    if (new File(wow64_kernel).exists()) {
        try {
            System.load(wow64_kernel);
        } catch (UnsatisfiedLinkError e) {
            return true; // can not link 32-bit library into 64-bit process
        }
    }
    return false;
}

答案 2 :(得分:-1)

检查这个

 System.out.println(System.getProperty("os.arch"));