java cpu使用监控
有没有一种方法可以使用纯Java监控CPU使用情况?使用纯Java是不可能的。查看此部分了解一些想法。如果遇到问题,您可以通过在后台线程中运行间歇式bogomips计算器,并平滑和正常化其结果来“感知”cpu可用性。java cpu使用监控,java,cpu-usage,Java,Cpu Usage,有没有一种方法可以使用纯Java监控CPU使用情况?使用纯Java是不可能的。查看此部分了解一些想法。如果遇到问题,您可以通过在后台线程中运行间歇式bogomips计算器,并平滑和正常化其结果来“感知”cpu可用性。 …值得一试否:?在kgiannakakis链接的文章评论中有一块宝石: JavaSysMon管理进程和 报告有用的系统性能 跨平台的度量。你可以思考 作为跨平台版本的 UNIX“top”命令,以及 杀死进程的能力。它进来了 单个JAR文件的形式/ -适用于Windows、Mac
…值得一试否:?在kgiannakakis链接的文章评论中有一块宝石: JavaSysMon管理进程和 报告有用的系统性能 跨平台的度量。你可以思考 作为跨平台版本的 UNIX“top”命令,以及 杀死进程的能力。它进来了 单个JAR文件的形式/
-适用于Windows、Mac OS X、Linux和Solaris。使用jmx mbeans如何
final OperatingSystemMXBean myOsBean=
ManagementFactory.getOperatingSystemMXBean();
double load = myOsBean.getSystemLoadAverage();
您可以使用JMXbean来计算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);
}
然后,当您的循环(假设您的应用程序使用循环,否则测量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;
}
如果您使用的是linux—只需使用
jconsole
—您就可以了解java内存管理的所有内容,这是一个合理的想法。不过,您必须使用适当的微基准技巧(运行一段时间,在计时之前预热所有循环,使用System.nanoTime()
)。在时间间隔内,性能也会有相当大的波动。在Windows平台上为我提供-1。文档说-1表示不受支持。但是在linux上,我得到的值比操作系统所说的要小,所以我假设这是当前JVM使用的CPU负载
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;
}