我目前使用JMX以下列方式获得总线程CPU时间:
private long calculateTotalThreadCpuTime(ThreadMXBean thread) {
long totalTime = 0l;
for (ThreadInfo threadInfo : thread.dumpAllThreads(false, false))
totalTime += thread.getThreadCpuTime(threadInfo.getThreadId());
return totalTime;
}
Run Code Online (Sandbox Code Playgroud)
由于ThreadMXBean实际上是一个远程代理,性能是可怕的,这个实际方法调用的大小为秒.
有更快的方法吗?
更新:我正在使用它进行性能监控.测量结果是"挂钟"时间和JProfiler,显示我花费大约85%的时间用于此方法.我确实有一些其他MXBean调用(运行时,内存,GC),但它们便宜得多.很可能是因为每次呼叫thread.getThreadCpuTime都是远程呼叫.
更新2:显示性能问题的JProfiler屏幕截图.

优化:
Thread.STATE.TERMINATED,将其名称保存在 Map 中并在下次查询时跳过。