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

如何从脚本分析Java线程状态摘要,java,multithreading,jvm,profiling,Java,Multithreading,Jvm,Profiling,我知道像和这样的工具是监视java进程线程状态的良好可视化工具。 我想要的是一个命令行工具,它调用一个java进程(或附加到一个进程),并且对于给定的线程(按名称),在进程退出时打印该线程状态的摘要。 例如: $ sometool $pid $ sometool java -jar myapp.jar -a 1 -b 2 ... 20% runnable 50% waiting 30% blocked 我之所以需要它,是因为我正在用不同的参数运行数十次调用java进程的实验,并且我想绘制各种运

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

$ sometool $pid
$ sometool java -jar myapp.jar -a 1 -b 2 ...
20% runnable
50% waiting
30% blocked
我之所以需要它,是因为我正在用不同的参数运行数十次调用java进程的实验,并且我想绘制各种运行的等待/总时间。jvisualvm没有任何用处,除非它可以在没有UI的命令行模式下调用。通过上述工具,这是可能的,但我不是Java评测方面的专家


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

我最终在类内部实现了自己的分析器。 我在开始时启用了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
      );
    }

}

我最终实现了自己的分析器,在类内部使用。 我在开始时启用了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
      );
    }

}

你检查过了吗?是的,我检查过了,但这是一个一次性堆栈跟踪,我应该定期调用它并在最后进行计算吗?我正在寻找一种简单的方法,因为jvisualvm已经在饼图中显示了这样的信息。附带问题:等待时间真的重要吗?您不应该测量应用程序级别的吞吐量和/或延迟吗?是的,这很重要,我们正在做分布式实验,测量非分布式的加速比,考虑到远程机器上不同进程之间的同步所导致的等待时间。您检查过了吗?是的,我检查过了,但这是一次性堆栈跟踪,我应该定期给它打电话,并在最后计算一下吗?我正在寻找一种简单的方法,因为jvisualvm已经在饼图中显示了这样的信息。附带问题:等待时间真的重要吗?您不应该测量应用程序级别的吞吐量和/或延迟吗?是的,这很重要,我们正在做分布式实验,测量非分布式的加速比,考虑到远程机器上不同进程之间的同步所导致的等待时间。