如何获得JVM中所有线程的CPU百分比?

我有一个Java监控应用程序,我用它来监视CPU(除其他外)在Linux上。

我正在使用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%时发出警报,并确定线程列表中可能的元凶。

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