str*_*ner 10
在文章的评论中有一个宝石,与kgiannakakis联系在一起:
JavaSysMon管理流程并报告跨平台的有用系统性能指标.您可以将其视为UNIX"top"命令的跨平台版本,以及杀死进程的能力.它以单个JAR文件/ ...的形式出现.
- 适用于Windows,Mac OS X,Linux和Solaris.
使用jmx mbeans怎么样?
final OperatingSystemMXBean myOsBean=
ManagementFactory.getOperatingSystemMXBean();
double load = myOsBean.getSystemLoadAverage();
Run Code Online (Sandbox Code Playgroud)
您可以使用jMX bean来计算CPU负载.请注意,这会测量java程序的CPU负载,而不是整个系统负载.(问题没有说明哪个)
初始化:
ThreadMXBean newBean = ManagementFactory.getThreadMXBean();
try
{
if (this.newBean.isThreadCpuTimeSupported())
this.newBean.setThreadCpuTimeEnabled(true);
else
throw new AccessControlException("");
}
catch (AccessControlException e)
{
System.out.println("CPU Usage monitoring is not available!");
System.exit(0);
}
Run Code Online (Sandbox Code Playgroud)
然后作为你的循环(假设你的应用程序使用循环,否则测量CPU使用率的重点是什么?)使用:
long lastTime = System.nanoTime();
long lastThreadTime = newBean.getCurrentThreadCpuTime();
while (true)
{
// Do something that takes at least 10ms (on windows)
try
{
int j = 0;
for (int i = 0; i < 20000000; i++)
j = (j + i) * j / 2;
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
// Calculate coarse CPU usage:
long time = System.nanoTime();
long threadTime = newBean.getCurrentThreadCpuTime();
double load = (threadTime - lastThreadTime) / (double)(time - lastTime);
System.out.println((float)load);
// For next iteration.
lastTime = time;
lastThreadTime = threadTime;
}
Run Code Online (Sandbox Code Playgroud)
你需要使用双精度,因为long不适合浮点数(虽然它可能在99.9999999999999999%的时间内工作)
如果您所做的"某事"花费的时间少于约1.6毫秒(Windows),则返回的值甚至根本不会增加,您将永远错误地测量0%的CPU.
因为getCurrentThreadCpuTime非常不准确(延迟小于100毫秒),平滑它有很大帮助:
long lastTime = System.nanoTime();
long lastThreadTime = newBean.getCurrentThreadCpuTime();
float smoothLoad = 0;
while (true)
{
// Do something that takes at least 10ms (on windows)
try
{
int j = 0;
for (int i = 0; i < 2000000; i++)
j = (j + i) * j / 2;
Thread.sleep(10);
}
catch (InterruptedException e)
{
}
// Calculate coarse CPU usage:
long time = System.nanoTime();
long threadTime = newBean.getCurrentThreadCpuTime();
double load = (threadTime - lastThreadTime) / (double)(time - lastTime);
// Smooth it.
smoothLoad += (load - smoothLoad) * 0.1; // damping factor, lower means less responsive, 1 means no smoothing.
System.out.println(smoothLoad);
// For next iteration.
lastTime = time;
lastThreadTime = threadTime;
}
Run Code Online (Sandbox Code Playgroud)