使用JMX获取线程CPU时间的有效方法

Rob*_*anu 6 java jmx

我目前使用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屏幕截图.

替代文字

Rob*_*anu 1

优化:

  • 在线程池内调用 getThreadCPUTime,因为它似乎是网络绑定的;
  • 每当发现一个线程在 中时Thread.STATE.TERMINATED,将其名称保存在 Map 中并在下次查询时跳过。