Java线程开始时间

时间:2015-03-09 04:13:13

标签: java multithreading time jvm

是否可以在JVM中检索给定java线程的开始时间?

我有一个线程转储,我正在查看一些有问题的线程,我希望使用时间与应用程序日志中的特定操作相关联。

3 个答案:

答案 0 :(得分:4)

Java API中没有为您提供此信息的方法。此外,它可能不会有用。考虑线程池的情况,其中线程创建不一定与应用程序级事件相关联。

如果您完全控制线程创建,那么您可以将线程局部变量附加到记录其创建时间的线程。

答案 1 :(得分:2)

是的,如果您在Linux上运行Oracle JDK / OpenJDK,则可能会这样做。

想法是找到本机线程ID(TID),然后查看/proc/JAVA_PID/task/TID伪文件的修改时间。

如果你有一个线程转储,那么这是微不足道的:本机线程id将由线程头打印。

例如,Java进程PID为2086.您键入

$ jstack 2086

并使用以下感兴趣的线程获取堆栈跟踪:

"Thread-26" prio=10 tid=0x00007f96c80c2800 nid=0x86a waiting on condition [0x00007f96c0ff2000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)

其中nid=0x86a是本机线程ID。 0x86a = 2154,所以你想探索过程2086的任务2154:

$ ls -ld /proc/2086/task/2154
dr-xr-xr-x 6 user user 0 Mar 10 23:12 /proc/2086/task/2154
                         ^^^^^^^^^^^^
                         the thread start time

答案 2 :(得分:0)

尝试使用" ps -p $ pid -wLo lwp,lstart"