2

我有一个程序,x86当我使用 32 位 java 执行时,它给了我在 64 位系统上的体系结构类型。

如果我提供 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

4

1 回答 1

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在相同的代码中使用命令来获取架构。

系统可以像本文一样确定

于 2013-11-23T12:54:03.317 回答