Java线程开始时间
Java thread start time
是否可以检索 JVM 中给定 java 线程的开始时间?
我有一个线程转储,正在查看一些有问题的线程,我想使用时间将它们关联到应用程序日志中的特定操作。
Java API 中没有方法可以为您提供此信息。此外,它可能无论如何都没有用。考虑线程池的情况,其中线程创建不一定与应用程序级事件相关联。
如果您完全控制线程的创建,那么您可以将线程局部变量附加到记录其创建时间的线程。
是的,如果您是 运行 Oracle JDK / OpenJDK on Linux.
,则有可能
思路是找到native thread id (TID) 然后查看/proc/JAVA_PID/task/TID
伪文件的修改时间
如果您有线程转储,那么这很简单:本机线程 ID 将由线程 header.
打印
例如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
尝试使用 "ps -p $pid -wLo lwp,lstart"
是否可以检索 JVM 中给定 java 线程的开始时间?
我有一个线程转储,正在查看一些有问题的线程,我想使用时间将它们关联到应用程序日志中的特定操作。
Java API 中没有方法可以为您提供此信息。此外,它可能无论如何都没有用。考虑线程池的情况,其中线程创建不一定与应用程序级事件相关联。
如果您完全控制线程的创建,那么您可以将线程局部变量附加到记录其创建时间的线程。
是的,如果您是 运行 Oracle JDK / OpenJDK on Linux.
,则有可能思路是找到native thread id (TID) 然后查看/proc/JAVA_PID/task/TID
伪文件的修改时间
如果您有线程转储,那么这很简单:本机线程 ID 将由线程 header.
打印例如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
尝试使用 "ps -p $pid -wLo lwp,lstart"