4

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

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

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

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

4

3 回答 3

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

数据转储将以字符数据流的形式返回转储。

于 2010-05-04T15:12:00.883 回答
1

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

于 2010-04-07T13:55:48.823 回答
0

如果您在 Windows 上,那么 bwithers 已经描述了一种向 JVM 发出信号以进行线程转储的方法。

还有一种纯 java 方法,但我不确定输出是否为标准格式。

于 2010-03-16T09:41:50.377 回答