我正在创建一个全局异常处理,在某些情况下关闭之前会收集一些信息。其中一个信息是当前的线程转储。我用以下代码执行此操作:
ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
问题是将信息写入TDA的可分析格式。是否有一种“简单”的方式来格式化信息而不是自己编写格式?
编辑:我想要一个完整的线程转储,所以我可以找到有问题的线程。上面提到的方法提供了一个ThreadInfo-Objects数组,所以我有数据。我的问题是写入的输出不是TDA识别为线程转储的格式。答案 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,但我不确定输出是否为标准格式。