如何编写可分析的线程转储格式

时间:2010-03-16 08:55:29

标签: java formatting multithreading analysis dump

我正在创建一个全局异常处理,在某些情况下关闭之前会收集一些信息。其中一个信息是当前的线程转储。我用以下代码执行此操作:

ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);

问题是将信息写入TDA的可分析格式。是否有一种“简单”的方式来格式化信息而不是自己编写格式?

编辑:我想要一个完整的线程转储,所以我可以找到有问题的线程。上面提到的方法提供了一个ThreadInfo-Objects数组,所以我有数据。我的问题是写入的输出不是TDA识别为线程转储的格式。

3 个答案:

答案 0 :(得分:3)

如果您不想复制TDA代码(毕竟它是LGPL),您还可以使用Attach API以标准格式获取数据。据我所知,执行转储的唯一JVM内置代码是Attach代理中的本机代码。

String selfName = ManagementFactory.getRuntimeMXBean().getName();
final int selfPid = Integer.valueOf(selfName.substring(0, selfName.indexOf('@')));                

HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(Integer.toString(selfPid));

InputStream sDump = vm.remoteDataDump(new Object[]{"-l"}); // lowercase L for lock dump

数据转储将在字符数据流中返回转储。

答案 1 :(得分:1)

只需使用TDA用于转储JMX数据的代码:MBeanDumper.java

答案 2 :(得分:0)

如果您使用的是Windows,那么bwithers可以described向JVM发送信号以进行线程转储。

还有pure java approach,但我不确定输出是否为标准格式。