【问题标题】:Tracking Java thread creation and lifetime跟踪 Java 线程的创建和生命周期
【发布时间】:2012-03-26 15:05:31
【问题描述】:

是否有任何工具可用于跟踪 Java 线程的创建和生命周期?我会对以下所有内容感兴趣:

  • 调用new Thread()的调用栈
  • 调用start()的调用栈
  • run() 方法的生命周期

【问题讨论】:

  • 在您的特定环境中子类化是一个选项吗?

标签: java multithreading


【解决方案1】:

我已经编写并发布了一个开源工具来回答这个问题。

Java Live Thread Analyser

我已经在博客中介绍了该工具 here

【讨论】:

    【解决方案2】:

    我不知道有这样的框架。您当然可以继承 Thread 类并自行存储此信息,如下所示。但是,这不会跟踪在其他类中分配的Threads,例如Executors 等。

      public class MyThread extends Thread {
          StackTraceElement[] constructorTrace;
          StackTraceElement[] startTrace;
          long runStartTimeMillis;
          long runFinishTimeMillis;
    
          // you'll need to duplicate the constructors you need
          public MyThread() {
             super();
             constructorTrace = Thread.currentThread().getStacktrace();
          }
    
          @Override
          public void start() {
             super.start();
             startTrace = Thread.currentThread().getStacktrace();
          }
    
          @Override
          public void run() {
             runStartTimeMillis = System.currentTimeMillis();
             super.run();
             runFinishTimeMillis = System.currentTimeMillis();
          }
      }
    

    【讨论】:

    • 您也可以使用Thread.currentThread().getStacktrace()System.nanoTime() 进行计时。您也可以只存储 new Throwable 并仅在需要时获取 StackTrace。
    • 谢谢@Peter re:Thread.getStacktrace()。我忘记了。堆栈跟踪填充在 Throwable 构造函数中,所以我认为这不会节省任何东西。
    • 直到第一次调用堆栈跟踪元素数组才真正填充。
    • 哦。我懂了。 getStackTraceElement 我猜是把原生结构翻译成 Java StackTraceElement。说得通。谢谢。
    【解决方案3】:

    VisualVM now(*) 有一个线程标签

    (*) 不知道从什么时候开始

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2010-09-17
      • 2022-11-10
      • 2022-06-14
      • 1970-01-01
      • 2022-06-12
      相关资源
      最近更新 更多