java sigar cpu使用率_java – 使用Sigar API获取JVM CPU使用率

我认为这取决于Sigar如何解释可用信息.它可用的信息(CPU使用时间)不经常更新,而ProcCpu只是一个即时过程CPU使用信息,这就是为什么大多数ProcCpu的CPU使用率为0.从未见过它们,但对于某些ProcCpu来说,这个值应该是非常大的优于100%.

您可以在一段时间内获得CPU使用率,从开始和结束时刻分析两个ProcCpus,考虑CPU的使用时间和ProcCpu(lastTime)的时间.但请记住,CPU使用时间值不经常更新,因此可以为ProcCpus提供相同的CPU使用时间而不是第二次.要获得实际的CPU使用率信息,您必须收集两个或更多ProcCpus.

我概述了一个监视器,它聚合并更新有关CPU使用情况的信息:

import java.util.Timer;

import java.util.TimerTask;

import org.hyperic.sigar.ProcCpu;

import org.hyperic.sigar.Sigar;

class SigarLoadMonitor {

private static final int TOTAL_TIME_UPDATE_LIMIT = 2000;

private final Sigar sigar;

private final int cpuCount;

private final long pid;

private ProcCpu prevPc;

private double load;

private TimerTask updateLoadTask = new TimerTask() {

@Override public void run() {

try {

ProcCpu curPc = sigar.getProcCpu(pid);

long totalDelta = curPc.getTotal() - prevPc.getTotal();

long timeDelta = curPc.getLastTime() - prevPc.getLastTime();

if (totalDelta == 0) {

if (timeDelta > TOTAL_TIME_UPDATE_LIMIT) load = 0;

if (load == 0) prevPc = curPc;

} else {

load = 100. * totalDelta / timeDelta / cpuCount;

prevPc = curPc;

}

} catch (SigarException ex) {

throw new RuntimeException(ex);

}

}

};

public SigarLoadMonitor() throws SigarException {

sigar = new Sigar();

cpuCount = sigar.getCpuList().length;

pid = sigar.getPid();

prevPc = sigar.getProcCpu(pid);

load = 0;

new Timer(true).schedule(updateLoadTask, 0, 1000);

}

public double getLoad() {

return load;

}

}

> ProcCpu – 按流程信息即时使用CPU

> curPc.getTotal() – 进程使用CPU的总时间

> curPc.getLastTime() – ProcCpu表示信息的时刻

> CPU使用率(load)是进程在某段时间内使用CPU的时间(totalDelta)与此时间段的持续时间(timeDelta)之间的比率.

虽然CPU使用时间不经常更新,但我引入了简单的启发式方法,假设负载与之前的相同,而CPU使用时间不会更新.但是假设一段时间内它可能是零负载,我已经引入了一个持续时间(TOTAL_TIME_UPDATE_LIMIT),之后相同的CPU使用时间值变得合法,并且假设负载实际为零.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值