Java线程启动时间

9

在JVM中,能否检索给定Java线程的启动时间?

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

3个回答

4

Java API中没有提供此信息的方法。此外,即使提供了该方法,它可能也不是很有用。考虑线程池的情况,其中线程创建并不一定与应用程序级事件相关。

如果您完全控制线程创建,则可以将线程本地变量附加到线程上,记录其创建时间。


感谢您的回复。我相信这些线程是由用户请求调用的。不幸的是,我目前没有修改代码的能力,必须使用当前正在生产中运行的任何内容。 - bob dabelina
它们是由容器(例如应用服务器)创建的还是您的应用程序代码创建的? - amahfouz
它们是由容器创建的。 - bob dabelina

3

如果您在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

感谢您的输入。然而,我还没有完全理解这个解释。我已经有一个线程转储了。每个线程是否有一个TID伪文件?如果您能提供一个例子,那就太好了。 - bob dabelina
@bobdabelina 我已经更新了答案,并提供了一个示例。 - apangin
非常感谢。这非常有帮助。 - bob dabelina
你好,我尝试了这种方法,但我始终看到时间戳设置为当前时间。还有其他需要考虑的吗? - bob dabelina
@bobdabelina 尝试使用 stat /proc/PID/task/TID 或者 ls -l /proc/PID/task/TID 命令来列出与该线程相关的所有伪文件。它们是否都具有相同的时间戳? - apangin

1
尝试使用“ps -p $pid -wLo lwp,lstart”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接