【问题标题】:JAVA function to detect CPU size [duplicate]检测CPU大小的JAVA函数[重复]
【发布时间】:2014-03-07 01:30:01
【问题描述】:

如何在 java 中编写一个函数来检测您的操作系统是在 32 位处理器还是 64 位处理器上运行?我在互联网上找到的一个答案是这个 将 1 转换为 int 直到 int 翻转为 0 并计算您能够移动的位置。 但我无法理解解决方案。

【问题讨论】:

  • 您用int 描述的解决方案在Java 中不起作用,因为在Java 中(与C 或C++ 不同)int 始终是32 位,无论JVM 和您是否在操作您正在运行的是 32 位或 64 位。

标签: java


【解决方案1】:

使用本地语言,例如 C 和 C++:

  • 您的代码直接在 CPU 上执行。

  • 您可以直接访问内存,这是该语言还提供确定不同类型大小的能力的主要原因(使用 sizeof 运算符)。

使用非本地语言,例如 Java 和 C#:

  • 您的代码在 VM 上执行(本质上是一个 CPU 仿真程序)。

  • 您无法直接访问内存,因此该语言并不真正需要提供确定不同类型大小的能力。

因此,在 C 和 C++ 中,您可以使用 sizeof(void*) * CHAR_BIT 来确定处理器内存总线的宽度,但在 Java 和 C# 中不能这样做。

您提到的解决方案可能假设Java中int的大小在32位VM上为32位,在64位VM上为64位。

即使这个假设是正确的,它也会指示您正在运行的虚拟机的类型,而不是您正在运行的CPU的类型 .

现在,假设 Java 中 int 的大小在 32 位 VM 上确实是 32 位,在 64 位 VM 上是 64 位,下面是解决方案背后的逻辑:

int n = 1; // n == 0x0000000000000001 (iteration #0)
n <<= 1;   // n == 0x0000000000000002 (iteration #1)
n <<= 1;   // n == 0x0000000000000004 (iteration #2)
n <<= 1;   // n == 0x0000000000000008 (iteration #3)
n <<= 1;   // n == 0x0000000000000010 (iteration #4)
n <<= 1;   // n == 0x0000000000000020 (iteration #5)
n <<= 1;   // n == 0x0000000000000040 (iteration #6)
n <<= 1;   // n == 0x0000000000000080 (iteration #7)
n <<= 1;   // n == 0x0000000000000100 (iteration #8)
n <<= 1;   // n == 0x0000000000000200 (iteration #9)
n <<= 1;   // n == 0x0000000000000400 (iteration #10)
n <<= 1;   // n == 0x0000000000000800 (iteration #11)
...
n <<= 1;   // n == 0x1000000000000000 (iteration #60)
n <<= 1;   // n == 0x2000000000000000 (iteration #61)
n <<= 1;   // n == 0x4000000000000000 (iteration #62)
n <<= 1;   // n == 0x8000000000000000 (iteration #63)
n <<= 1;   // n == 0x0000000000000000 (iteration #64)

在 32 位系统上,n 将在 0x00000001 和 0x80000000 之间运行,然后变为 0x00000000(经过 32 次迭代)。

但是如果上面的假设是正确的,那么你还不如只在一次移位操作中做到这一点:

int n = 0x80000000;
if (n<<1 == 0)
    ; // 32-bit system
else
    ; // 64-bit system

作为旁注,我不得不说我一开始就怀疑这个假设。在 32 位 VM 上,int 的大小为 32 位,long 的大小为 64 位。那么long 在 64 位虚拟机上的大小是多少呢???

【讨论】:

    【解决方案2】:

    System.getProperty("os.arch");

    在我的电脑上返回 amd64。

    顺便说一句,这确实是一个流行的陷阱。

    甲骨文的文章: Beware when detecting the 32 or 64 bit OS

    请注意,os.arch 属性只会为您提供 JRE 的架构,而不是底层操作系统的架构。

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

    为了真正确定底层架构,您需要编写一些本机代码。有关更多信息,请参阅这篇文章(以及示例本机代码的链接)。

    如果您使用的是 Windows,那么这将是您的确切解决方案:

    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);
    

    }`

    可以使用以下代码检测处理器架构:

        String arch = System.getenv("PROCESSOR_ARCHITECTURE");
    String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432");
    
    String realArch = arch.endsWith("64")
                      || wow64Arch != null && wow64Arch.endsWith("64")
                          ? "64" : "32";
    System.out.println(realArch);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-21
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多