跟踪 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
类并自行存储此信息,如下所示。但是,这不会跟踪在其他类中分配的Thread
s,例如Executor
s 等。
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 线程的创建和生命周期的主要内容,如果未能解决你的问题,请参考以下文章