Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于检测CPU大小的JAVA函数_Java - Fatal编程技术网

用于检测CPU大小的JAVA函数

用于检测CPU大小的JAVA函数,java,Java,如何用java编写函数来检测操作系统是在32位处理器上运行还是在64位处理器上运行?我在网上找到的一个答案是 将1转换为整数,直到整数翻转为0,然后计算可以转换的位置数。 但我无法理解解决方案 System.getProperty os.arch 在我的电脑上返回amd64 顺便说一句,这真是一个很受欢迎的问题 甲骨文的文章: 请注意,os.arch属性只提供JRE的体系结构,而不是底层操作系统的体系结构 如果在64位系统上安装32位jre,system.getPropertyos.arch将

如何用java编写函数来检测操作系统是在32位处理器上运行还是在64位处理器上运行?我在网上找到的一个答案是 将1转换为整数,直到整数翻转为0,然后计算可以转换的位置数。
但我无法理解解决方案

System.getProperty os.arch

在我的电脑上返回amd64

顺便说一句,这真是一个很受欢迎的问题

甲骨文的文章:

请注意,os.arch属性只提供JRE的体系结构,而不是底层操作系统的体系结构

如果在64位系统上安装32位jre,system.getPropertyos.arch将返回x86

为了实际确定底层架构,您需要编写一些本机代码。有关更多信息和本机代码示例的链接,请参阅本文

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

boolean is64bit = false;
如果System.getPropertyos.name.containsWindows{

}否则{

}`

可以使用以下代码检测处理器体系结构:

    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);
在本机语言中,如C和C++:

您的代码直接在CPU上执行

您可以直接访问内存,这是语言还能够使用sizeof运算符确定不同类型大小的主要原因

在非本机语言(如Java和C)中:

您的代码在虚拟机上执行,虚拟机本质上是一个CPU仿真程序

您无法直接访问内存,因此该语言实际上不需要提供确定不同类型大小的功能

<> p>因此,在C和C++中,你可以使用sisiffOffux*CalaBIT来确定处理器的内存总线的宽度,在java和c/p>中你不能做同样的事情。 您提到的解决方案可能假设Java中int的大小在32位VM上为32位,在64位VM上为64位

即使这个假设是真的,它也将指示您正在运行的VM的类型,而不是您正在运行的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位虚拟机上,int的大小是32位,long的大小是64位。那么64位虚拟机上的long大小是多少呢?

如果在x32位JVM中运行它,这将不起作用。更多细节请参见用int描述的解决方案在java中不起作用,因为在Java中,与C++或C++不同,int(java)总是32位,无论JVM和运行的运行是32位还是64位。
    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);
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)
int n = 0x80000000;
if (n<<1 == 0)
    ; // 32-bit system
else
    ; // 64-bit system