java cpu使用情况监控

有没有办法使用纯Java监控CPU使用率?

关于文章的评论中有一个gem,与kgiannakakis联系在一起:

javasysmon

JavaSysMon管理流程并报告跨平台的有用系统性能指标。 您可以将其视为UNIX“top”命令的跨平台版本,以及杀死进程的能力。 它以单个JAR文件/ …的forms出现。

-works,适用于Windows,Mac OS X,Linux和Solaris。

使用jmx mbeans怎么样?

final OperatingSystemMXBean myOsBean= ManagementFactory.getOperatingSystemMXBean(); double load = myOsBean.getSystemLoadAverage(); 

可以使用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); } 

然后作为你的循环(假设你的应用程序使用循环,否则测量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; } 

你需要使用双精度,因为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; } 

使用纯Java是不可能的。 有关一些想法,请参阅此文章 。

也许如果卡住,您可能会通过在后台线程中运行间歇性的bogomips计算器来“感知”cpu可用性,并平滑和规范化其结果。 …值得一试:

如果您使用的是Linux – 只需使用jconsole – 您将获得Java内存管理的所有内容