如何在Java中检测苹果芯片(M1)和英特尔芯片?

4

对于那些不理解问题的人,请注意,os.arch属性只会给出JRE的架构,而不是底层操作系统的架构,这并不能回答我的问题。

如果您在64位系统上安装了32位JRE,则System.getProperty("os.arch")将返回x86。

为了实际确定底层架构,您需要编写一些本地代码。

我希望我的应用程序在处理器为英特尔时执行某些操作,在处理器为苹果芯片时执行其他操作。

我尝试过:

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

但在英特尔上,os.arch 的值与 Apple Silicon 相同 = x86_64。


3
显然,您正在使用x86仿真运行JVM。 - access violation
请注意,os.arch属性只会给出Java虚拟机的位数,而不是操作系统的位数。要确定Windows操作系统的位数,您需要编写一些本地代码。 - Ashish Patil
可能是获取操作系统级别的系统信息的重复问题。 - Hovercraft Full Of Eels
可能是检测CPU型号信息的重复问题。 - Hovercraft Full Of Eels
这个回答解决了你的问题吗?如何使用Java确定Windows的32位或64位架构? - Mayuri S Kulkarni
1
这不是重复的内容。你给我的东西我已经搜索过了,那只会告诉你你所拥有的 JRE 架构。因为在 M1 处理器上可能会安装适用于英特尔处理器的 JDK。我需要的是处理器类型,而不是核心数、内存等信息。答案如下 :) 无论如何,感谢您的所有帮助和关注。 - Andrei27
1个回答

2

您需要从操作系统中获取此信息。在Windows上,有一个环境变量 - PROCESSOR_IDENTIFIER - 您可以通过方法getenv获取,如下所示:

System.getenv("PROCESSOR_IDENTIFIER");

在我的 Windows 10 设备上,我遇到以下问题:

Intel64 Family 6 Model 158 Stepping 11, GenuineIntel

我没有Mac电脑,但根据这里的说明,您可以通过类ProcessBuilder调用命令。

ProcessBuilder pb = new ProcessBuilder("sysctl", "-n", "machdep.cpu.brand_string");
try {
    Process p = pb.start();
    BufferedReader br = p.inputReader();
    String output = br.readLine();
    int status = p.waitFor();
    if (status == 0) {
        // Command succeeded.
    }
}
catch (InterruptedException | IOException x) {
    x.printStackTrace();
}

所以您可能想要类似以下代码:

String details;
if ("Windows 10".equals(System.getProperty("os.name"))) {
    details = System.getenv("PROCESSOR_IDENTIFIER");
}
else if ("Mac OS X".equals(System.getProperty("os.name"))) {
    ProcessBuilder pb = new ProcessBuilder("sysctl", "-n", "machdep.cpu.brand_string");
    try {
        Process p = pb.start();
        BufferedReader br = p.inputReader();
        details = br.readLine();
        int status = p.waitFor();
        if (status == 0) {
            // Command succeeded.
        }
    }
    catch (InterruptedException | IOException x) {
        x.printStackTrace();
    }
}

1
非常感谢!这正是我所需要的。有关“Apple M1”或“Intel”的信息。我不知道您可以从Java运行进程构建器:D - Andrei27
@Andrei27 我最近刚查了这个,还有很多其他有趣的信息可以获取。如果我找到了在网上找到的参考资料,我会在这里发布以供将来参考。 - hfontanez
@hfontanez 那将是太棒了。 - Andrei27
https://www.logicbig.com/how-to/code-snippets/jcode-java-system-getenv.html - hfontanez
@Andrei27,有一个更好的,但这已经足够好了。 - hfontanez
除了 sysctl其他可能性 也可能有用(一些更常见的,例如,如果您将来要以相同方式处理 M1、M2、M##)是 unamearch - Joshua Goldberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接