我知道像jvisualvm和JConsole这样的工具是监视java进程线程状态的良好可视化工具。 我想要的是一个命令行工具,它调用一个java进程(或附加到一个)和一个给定的线程(按名称),在进程退出时打印该线程状态的摘要。 例如:
$ sometool $pid
$ sometool java -jar myapp.jar -a 1 -b 2 ...
20% runnable
50% waiting
30% blocked
我需要这个,因为我正在运行实验,用不同的参数调用我的java进程数十次,我想绘制各种运行的等待/总时间。 jvisualvm没有用,除非它可以在没有UI的命令行模式下调用。这可能是通过上述工具实现的,但我不是Java分析专家。
更新:找到MXBeans,但我必须编写一些代码来检索数字。我会尝试一下,但是现成的解决方案会很好。
答案 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
);
}
}