Sigar ProcCpu gather方法总是返回0表示百分比值

时间:2018-01-23 15:55:44

标签: java cpu percentage zero sigar

我正在使用Sigar尝试获取各个进程的CPU和内存使用情况(在Windows下)。我可以使用以下代码正确地为整个系统获取这些统计数据:

Sigar sigar = new Sigar();

long totalMemory = sigar.getMem().getTotal() / 1024 /1024;
model.addAttribute("totalMemory", totalMemory);

double usedPercentage = sigar.getMem().getUsedPercent();
model.addAttribute("usedPercentage", String.format( "%.2f", usedPercentage));

double freePercentage = sigar.getMem().getFreePercent();
model.addAttribute("freePercentage", String.format( "%.2f", freePercentage));

double cpuUsedPercentage = sigar.getCpuPerc().getCombined() * 100;
model.addAttribute("cpuUsedPercentage", String.format( "%.2f", cpuUsedPercentage));

这在我的网页上显示以下内容:

系统内存总量:16289 MB 使用记忆百分比:66.81% 可用内存百分比:33.19% CPU使用率:30.44%

现在我正在尝试从Java和SQL Server等各个进程获取信息,并且在正确收集内存的情况下,两个进程的CPU使用率总是为0.以下是我正在使用的代码:

Sigar sigar = new Sigar();
List<ProcessInfo> processes = new ArrayList<>();

ProcessFinder processFinder = new ProcessFinder(sigar);
long[] javaPIDs = null;
Long sqlPID = null;

try
{
    javaPIDs = processFinder.find("Exe.Name.ct=" + "java.exe");
    sqlPID = processFinder.find("Exe.Name.ct=" + "sqlservr.exe")[0];
}
catch (Exception ex)
{}

int i = 0;

while (i < javaPIDs.length)
{
    Long javaPID = javaPIDs[i];
    ProcessInfo javaProcess = new ProcessInfo();
    javaProcess.setPid(javaPID);
    javaProcess.setName("Java");

    ProcMem javaMem = new ProcMem();
    javaMem.gather(sigar, javaPID);
    javaProcess.setMemoryUsage(javaMem.getResident() / 1024 / 1024);

    MultiProcCpu javaCpu = new MultiProcCpu();
    javaCpu.gather(sigar, javaPID);
    javaProcess.setCpuUsage(String.format("%.2f", javaCpu.getPercent() * 100));

    processes.add(javaProcess);

    i++;
}

if (sqlPID != null)
{
    ProcessInfo sqlProcess = new ProcessInfo();
    sqlProcess.setPid(sqlPID);
    sqlProcess.setName("SQL Server");

    ProcMem sqlMem = new ProcMem();
    sqlMem.gather(sigar, sqlPID);

    sqlProcess.setMemoryUsage(sqlMem.getResident() / 1024 / 1024);

    ProcCpu sqlCpu = new MultiProcCpu();
    sqlCpu.gather(sigar, sqlPID);
    sqlProcess.setCpuUsage(String.format( "%.2f", sqlCpu.getPercent()));

    processes.add(sqlProcess);
}

model.addAttribute("processes", processes);

我已经尝试了ProcCpuMultiProcCpu,即使我在任务管理器中看到使用15%CPU的Java,它们也总是返回0.0。关于Sigar库的文档几乎不存在,但我做的研究告诉我,我似乎正确地做了这个。

有谁知道我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

我在继续在线搜索时发现了这个问题。基本上,sigar库只能在一定时间后检索正确的CPU值。我的问题是我每次显示页面时都在初始化一个新的Sigar实例。我将我的Sigar实例全局化为我的Spring控制器,现在它返回正确的百分比。