问题遇到的现象和发生背景
我在写一个程序,程序需要能够获得CPU占用。但是我又不会写,于是我就从C上抄了一份能够得到CPU占用的代码
问题相关代码,请勿粘贴截图
SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
long[] prevTicks = processor.getSystemCpuLoadTicks();
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
GlobalMemory memory = systemInfo.getHardware().getMemory();
long totalByte = memory.getTotal();
long acaliableByte = memory.getAvailable();
result.append("当前机器CPU核心数量:").append(processor.getLogicalProcessorCount());
result.append("\n");
result.append("当前机器CPU总占用:").append(new DecimalFormat("#.##%").format(1.0-(idle * 1.0 / totalCpu))).append("%");
运行结果及报错内容
不报错,但是有一个问题。第一次得到的CPU占比是好的,但是第二次的时候,idle和totalCpu就变成0了,0/0结果引发了NaN,以下是debug截图:
可以看到很多参数都是0
我的解答思路和尝试过的方法
我对Oshi也不太了解(毕竟代码都是抄的),而且第一遍运行都是好的第二遍就成了0这种疑难杂症本来就难治。没办法了来发个问题
我想要达到的结果
让他别为0,正常显示