jconsole中自帶了進程的cpu使用率,閱讀源碼後,我移植到線程上了。java
如下jconsole是進程cpu計算的代碼算法
float cpuUsage = Math.min(99F,elapsedCpu / (elapsedTime * 10000F * result.nCPUs));
elapsedCpu是一段時間進程佔用cpu的時間jvm
elapsedTime是Java 虛擬機的正常運行時間只差spa
nCPUs是jvm可用的cpu數量線程
進程cpu的利用率=進程時間差/(jvm運行時間差)*可用的cpu數量code
線程的cpu時間ThreadMXBean的getThreadCpuTime進程
jvm運行時間RuntimeMXBean的getUptimeget
jvm可用的核心數OperatingSystemMXBean的getAvailableProcessors源碼
一切都ok了,這個算法雖然感受怪怪的,可是結果靠得住,想一想jvm假如可以合理利用cpu,那麼這個算法是能等同於各個cpu運行時間之和。
虛擬機