【问题标题】:Java thread start timeJava线程开始时间
【发布时间】:2015-05-10 04:53:47
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading time jvm


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我相信这些线程是由用户请求调用的。不幸的是,我目前无法修改代码,并且必须使用当前在生产中运行的任何内容。
    • 它们是由容器(例如应用服务器)创建的还是由您的应用程序代码创建的?
    • 它们是由容器创建的。
    【解决方案2】:

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

    思路是找到native thread 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
    

    【讨论】:

    • 感谢您的意见。但是,我不太理解解释。我确实有一个线程转储。每个线程都有一个 TID 伪文件吗?如果你能提供一个例子,那就太好了。
    • @bobdabelina 我已经用一个例子更新了答案。
    • 非常感谢。这很有帮助。
    • 您好,我尝试了这种方法,但我总是看到时间戳设置为当前时间。还有什么要考虑的吗?
    • @bobdabelina 尝试stat /proc/PID/task/TIDls -l /proc/PID/task/TID 列出与该线程相关的所有伪文件。它们都具有相同的当前时间戳吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      相关资源
      最近更新 更多