我正在使用Sigar来获取应用程序服务器中当前正在运行的JVM的CPU使用率,并将其存储为该数据的历史视图,但是我总是获得0%的CPU百分比。
同时,我保持visualVM处于打开状态以监视CPU使用率,并且看到visualVM中的CPU%定期更改,而使用Sigar总是报告0%。
这是我定期运行的代码:
Sigar sigar = new Sigar();
ProcCpu cpu = null;
long pId = sigar.getPid(); // This one gives me the same process ID that I see in visualVM
try {
cpu = sigar.getProcCpu(pId);
}
catch (SigarException se) {
se.printStackTrace();
}
System.out.print(cpu.getPercent());
该代码始终给出0%。
在这种情况下,我在做什么错呢?如何让Sigar显示类似于VisualVM中显示的CPU使用率?
我尝试添加
cpu.gather(sigar, pId);
在调用getProcCpu(pid)之后,但是即使我不断增加和减少服务器上的负载,我仍然只得到两个值(0.0和9.08729312E-315)…
我认为这取决于Sigar如何解释可用信息。可获得的信息(CPU使用时间)不是很频繁地更新,并且ProcCpu
只是即时的CPU使用信息,这就是为什么大多数CPU使用ProcCpu
率为0的原因。从未见过,但对于某些情况,ProcCpu
此值应大大超过100
%。
您可以获取一段时间的CPU使用率,ProcCpu
从它的开始和结束时刻开始分析两个s,并考虑CPU使用时间和ProcCpu
(lastTime)的时间。但是请记住,CPU使用时间值更新的频率不是很高,因此有可能使相同的CPU使用时间ProcCpu
相隔多于秒。要获得实际的CPU使用率信息,您必须收集两个或多个ProcCpu
。
我已绘制了一个监视器,该监视器汇总并更新了有关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
代表信息的时刻load
)是某个时间段(totalDelta
)中进程使用CPU 的时间与该时间段的持续时间(timeDelta
)的比率。尽管CPU使用时间不经常更新,但我引入了简单的启发式方法,它假定负载与以前相同,而CPU使用时间不更新。但是,假设一段时间内某个进程的负载可能为零,我介绍了一个duration(TOTAL_TIME_UPDATE_LIMIT
),此后,相同的CPU使用时间值变为合法,并且负载实际上为零。
问题内容: 我正在尝试使用Java获取当前正在运行的Java虚拟机使用的CPU百分比。我的研究指出我要使用该类。通过在线示例,我编写了以下内容: 在两台计算机上对此进行测试后,我无法停止获得两个调用的结果。我尝试通过各种方法使用Java 7和6的64位和32位版本运行此代码。不过,我得到的是打印出的该,根据的Javadoc, 我不知道还要在这里做什么。获取CPU负载至关重要,我想避免使用其他库,例
获取使用者列表 请求方式: GET 请求地址: https://open.qingtui.cn/v1/app/followers?access_token=ACCESS_TOKEN&page_size=PAGE_SIZE&request_page=REQUEST_PAGE 参数说明: 参数 必须 说明 access_token 是 接口调用凭证 page_size 是 请求页面数量 request
问题内容: 我正在使用URL类从中读取InputStream。有什么我可以使用RestTemplate的方法吗? 我怎样才能 用,而不是使用? 问题答案: 您不应该直接获得。旨在封装处理响应(和请求)内容。它的优势在于处理所有IO,并为您提供现成的Java对象。 的一位原始作者Brian Clozel 表示: 并不意味着流响应主体;它的合同不允许这样做,而且已经存在了很长时间,以至于在不中断许多应
问题内容: 我需要从http://vortaro.us.to/ajax/epo/eng/ +’word’+“ /?callback =?” 获取json数据 。工作示例(信誉不足) 我知道如何用JavaScript来做,但是我需要我的php文件来获取此数据,它必须是服务器端的,谢谢。我是新手,我已经花了整整一天的时间来弄清楚这一点。fopen和fread不起作用, 问题答案: file_get_c
我使用URL类从中读取InputStream。有什么方法可以使用RestTemplate实现这一点吗? 如何使用RestTemplate而不是使用URL来获取InputStream?
问题内容: 在此示例中,我想将SRC属性转换为变量: 因此,例如-我想要一个变量。重要!src属性将是 dynamic ,因此不能进行硬编码。有什么快速简便的方法可以做到这一点吗? 谢谢! 编辑:图像将是一个巨大的字符串的一部分,基本上是新闻故事的内容。因此,图像只是其中的一部分。 EDIT2:此字符串中将有更多图像,我只想获取第一个的src。这可能吗? 问题答案: 使用类似的HTML解析器,然后