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