在JVM中,能否检索给定Java线程的启动时间?
我有一个线程转储,并正在查看一些有问题的线程,我想使用时间将它们与应用程序日志中的特定操作相关联。
在JVM中,能否检索给定Java线程的启动时间?
我有一个线程转储,并正在查看一些有问题的线程,我想使用时间将它们与应用程序日志中的特定操作相关联。
Java API中没有提供此信息的方法。此外,即使提供了该方法,它可能也不是很有用。考虑线程池的情况,其中线程创建并不一定与应用程序级事件相关。
如果您完全控制线程创建,则可以将线程本地变量附加到线程上,记录其创建时间。
如果您在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)
这段文本涉及到IT技术,需要翻译的是:
nid=0x86a
中的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
stat /proc/PID/task/TID
或者 ls -l /proc/PID/task/TID
命令来列出与该线程相关的所有伪文件。它们是否都具有相同的时间戳? - apangin