Java线程开始时间

bob*_*ina 7 java time multithreading jvm

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

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

apa*_*gin 3

是的,如果您在 Linux 上运行 Oracle JDK / OpenJDK,则可以。

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

如果您有线程转储,那么这很简单:本机线程 ID 将由线程头打印。

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

$ jstack 2086
Run Code Online (Sandbox Code Playgroud)

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

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

哪里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
Run Code Online (Sandbox Code Playgroud)