我目前正在通过以下方式使用 JMX 获取总线程 CPU 时间:
private long calculateTotalThreadCpuTime(ThreadMXBean thread) {
long totalTime = 0l;
for (ThreadInfo threadInfo : thread.dumpAllThreads(false, false))
totalTime += thread.getThreadCpuTime(threadInfo.getThreadId());
return totalTime;
}
由于 ThreadMXBean 实际上是一个远程代理,因此性能非常糟糕,对于这个实际的方法调用来说只有几秒的数量级。
有没有更快的方法来做到这一点?
更新:我用它来监控性能。测量结果是“挂钟”时间和 JProfiler,这表明我大约 85% 的时间都花在了这种方法上。我确实有其他一些 MXBean 调用(运行时、内存、GC),但它们要便宜得多。很可能是因为每次调用thread.getThreadCpuTime
都是远程调用。
更新 2:显示性能问题的 JProfiler 屏幕截图。