【问题标题】:Check whether the cureent JVM is 64 bit or 32 bit检查当前JVM是64位还是32位
【发布时间】:2014-08-04 16:59:27
【问题描述】:

经过对同一主题的一些研究,我使用方法“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。而且我不希望该方法在任何其他平台上工作。

【问题讨论】:

  • @Nidhin 你介意使用 JNI 和一个额外的 DLL 文件吗?
  • “而且我不希望该方法在任何其他平台上工作。”这与 Java 的主要哲学之一有些矛盾——一次编写,随处运行。你能做的最好的可能是一个native 电话。
  • @Joe 没有兄弟。我不这么认为。请再次检查我的问题。我看到了那个链接。甚至那个答案也不能完全解决我的问题。我认为这个问题很清楚。
  • 您说“在某些情况下出错了”。还有更详细的吗?链接的问题正是针对此问题的 Oracle 推荐方法。

标签: java jvm 32bit-64bit


【解决方案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】:

    您将需要这里的 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 函数来检查当前运行的进程。

    【讨论】:

    • 我会试试这个。感谢您的宝贵回答。
    • 这可能没有帮助。 JNA 库内部包含大多数流行平台的 DLL,它会在运行时加载其中一个。猜猜 JNA 如何检测它在哪个平台上运行?对,又是System.getProperty("os.arch")(见Native.loadNativeLibraryFromJar)。 OP 声称 os.arch 可能会出错,这意味着 JNA 库将无法加载。
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2010-11-03
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多