【问题标题】:How Do I Get The CPU Percentage For All Threads In The JVM?如何获取 JVM 中所有线程的 CPU 百分比?
【发布时间】:2014-08-02 03:05:43
【问题描述】:

我有一个 java 监控应用程序,用于监控 linux 上的 CPU(以及其他东西)。

我正在使用 Sigar 来获取我的进程的 CPU 使用率。 http://cpansearch.perl.org/src/DOUGM/hyperic-sigar-1.6.3-src/docs/javadoc/org/hyperic/sigar/Sigar.html#getProcCpu%28long%29

但是,这只是在流程级别。 htop 显示我的应用程序中的线程以及每个线程使用的 CPU 百分比。

Sigar 可以做到这一点吗?

如果我在多核机器上,是否可以获得每个核心的 CPU 利用率?

我想在 CPU 长时间以 100% 运行时发出警报,并在线程列表中找出可能的罪魁祸首。

【问题讨论】:

  • 您始终可以使用Process process = Runtime.getRuntime().exec(yourcmd); 执行您的命令(htop 等),然后使用process.getInputStream(); 从命令中读取返回的数据。
  • 系统监控的困难在于它们非常依赖于操作系统。即使决定任何 jvm 实现必须提供一些 api,我想也很难定义一个适用于所有操作系统的通用 api

标签: java linux sigar


【解决方案1】:

JMX 可用于从 Java 运行时获取此信息,尽管 CPU 负载似乎不是标准 Java API 的一部分,您需要转换为 com.sun.management.OperatingSystemMXBean

OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
double loadAverage = osBean.getSystemLoadAverage();
System.out.println("Load average: " + loadAverage);

if (osBean instanceof com.sun.management.OperatingSystemMXBean)
{
    com.sun.management.OperatingSystemMXBean sunOsBean = (com.sun.management.OperatingSystemMXBean)osBean;
    double cpuLoad = sunOsBean.getSystemCpuLoad();
    System.out.println("CPU load: " + cpuLoad);
}

【讨论】:

  • 这很有用,但是据我所知,这是在进程级别而不是线程级别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多