如何从脚本中分析Java线程状态摘要

时间:2015-07-09 00:36:16

标签: java multithreading jvm profiling

我知道像jvisualvmJConsole这样的工具是监视java进程线程状态的良好可视化工具。 我想要的是一个命令行工具,它调用一个java进程(或附加到一个)和一个给定的线程(按名称),在进程退出时打印该线程状态的摘要。 例如:

$ sometool $pid
$ sometool java -jar myapp.jar -a 1 -b 2 ...
20% runnable
50% waiting
30% blocked

我需要这个,因为我正在运行实验,用不同的参数调用我的java进程数十次,我想绘制各种运行的等待/总时间。 jvisualvm没有用,除非它可以在没有UI的命令行模式下调用。这可能是通过上述工具实现的,但我不是Java分析专家。

更新:找到MXBeans,但我必须编写一些代码来检索数字。我会尝试一下,但是现成的解决方案会很好。

1 个答案:

答案 0 :(得分:0)

我最终在课堂上使用ThreadMXBean实现了我自己的探查器。 我在开始时启用了CPU监控,并定期记录时间故障,最后检查这两个功能:

protected static void initMXBean()
{
    mxBean = ManagementFactory.getThreadMXBean();
    mxBean.setThreadContentionMonitoringEnabled(true);
    mxBean.setThreadCpuTimeEnabled(true);
}

protected static void logMXBean()
{
    long[] threadIds = mxBean.getAllThreadIds();
    ThreadInfo[] threadInfos =
                    mxBean.getThreadInfo(threadIds);

    for (ThreadInfo threadInfo : threadInfos) {
      System.out.println(
          threadInfo.getThreadName() +
          " blocked " + threadInfo.getBlockedTime()/1e6 +
          " waited " + threadInfo.getWaitedTime()/1e6 +
          " cpu " + mxBean.getThreadCpuTime(threadInfo.getThreadId())/1e9
      );
    }

}