跟踪 Java 线程的创建和生命周期

Posted

技术标签:

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

是否有任何工具可用于?我会对以下所有内容感兴趣:

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

【问题讨论】:

在您的特定环境中子类化是一个选项吗? 【参考方案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(*) 有一个线程标签

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

【讨论】:

以上是关于跟踪 Java 线程的创建和生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Java线程生命周期

Java线程的生命周期

java_5:线程的生命周期和状态转换

Java中线程的生命周期

Java多线程并发02——线程的生命周期与常用方法

Java中的线程生命周期