【问题标题】:How do I write a analyzable thread dump format如何编写可分析的线程转储格式
【发布时间】:2010-03-16 08:55:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • 想拥有什么样的格式? ThreadMXBean 提供了什么?
  • 你说的这个 TDA 是什么?
  • 我想是这个吧? tda.dev.java.net
  • 是的,tda.dev.java.net 是我所说的 TDA

标签: java formatting multithreading analysis dump


【解决方案1】:

如果您不想复制 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

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

【讨论】:

  • 不错的一个。不过需要在 Eclipse 中删除访问限制来解析 com.sun 类。
  • 只是添加... HotSpotVirtualMachine.class 仅在 1.6 或更高版本中可用,在 JDK 的 tools.jar 中
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您在 Windows 上,那么 bwithers 有 described 一种方法来向 JVM 发出信号以进行线程转储。

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

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      相关资源
      最近更新 更多