当我使用32位java执行时,我有一个程序在64位系统上为我提供架构类型x86
。
如果我提供64位java,那么它会返回x64
。
java bitmode如何影响sigar输出?
或者是否有一个不同的命令可以返回正确的机器拱和位模式类型?
这是我的示例代码
import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
public class SigarInfo {
private final Sigar sigar = new Sigar();
private final OperatingSystem os = OperatingSystem.getInstance();
public static void main(String[] args) throws SigarException{
SigarInfo sysInfo = new SigarInfo();
System.out.println("Arch: "+sysInfo.os.getArch());
System.out.println("Datamodel: "+sysInfo.os.getDataModel());
}
}
64位机器上的输出
Arch: x64
Datamodel: 64
32位机器上的输出
Arch: x86
Datamodel: 32
在具有32位Java的64位机器上输出
Arch: x86
Datamodel: 32
使用的版本:hyperic-sigar-1.6.4
答案 0 :(得分:3)
Sigar和纯Java总是返回JVM的体系结构,而不是操作系统的体系结构。这是因为有关您的操作系统的信息对于大多数应用程序来说都是无用的。
在99.9%的情况下,您需要了解JVM进程的确切体系结构,而不是操作系统版本,因为这会直接影响您的应用程序。 JVM体系结构确定应用程序应使用哪些本机库,内存结构,CPU运行模式以及许多其他方面。
想象一下,您在x64 Windows上运行x86 JVM。您需要确定应用程序可以使用多少内存。根据JVM信息,我可以回答这个问题。根据操作系统版本,我不能说什么。
因此,使用操作系统信息可能会导致错误的决定,因此我建议不要使用它。即使只是向用户显示它。
如果您确实需要出于某种原因确定操作系统版本,可以将其用于Windows:
Process process = Runtime.getRuntime().exec("CMD /C SYSTEMINFO | FINDSTR /B /C:\"System Type\"");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = bufferedReader.readLine();
if (line.indexOf("x64") > 0)
System.out.println("x64 architecure");
else
System.out.println("x86 architecure");
对于linux,您可以在相同的代码中使用lsb_release -a
命令来获得架构。
系统可以像Article
一样确定