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