首页 > 解决方案 > jstack输出中的大十六进制数字显示“停车等待......”是什么意思?

问题描述

我有 jstack,其中许多线程处于 WAITING 状态,描述为“停车等待”,例如:

java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@11.0.3/Native Method)
    - parking to wait for  <0x0000000307db96c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(java.base@11.0.3/LockSupport.java:194)

这个大的十六进制数是多少?是时候了吗?是标识符吗?

编辑

我已经使用在早上和下午工作很长时间(几天)的线程转储了我的 Java 应用程序的状态。我看到“等待条件”具有相同的大十六进制数字,但“等待停车”中的其他大十六进制数字不同:

早晨:

"qtp792232038-1037-..." #1037 prio=5 os_prio=0 cpu=787.64ms elapsed=528768.56s tid=0x00007f164004a800 nid=0x1346
waiting on condition  [0x00007f181fffd000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@11.0.3/Native Method)
    - parking to wait for  <0x000000030a69c410> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(java.base@11.0.3/LockSupport.java:194)
    ...

几个小时后:

"qtp792232038-1037-..." #1037 prio=5 os_prio=0 cpu=787.64ms elapsed=546900.36s tid=0x00007f164004a800 nid=0x1346
waiting on condition  [0x00007f181fffd000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@11.0.3/Native Method)
    - parking to wait for  <0x0000000307db96c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(java.base@11.0.3/LockSupport.java:194)
    ...

标签: javalockingjstack

解决方案


是的,它是锁对象的内部标识符。

您可以使用它来查看哪个线程正在等待哪个其他线程。

在线程转储中搜索此 ID,应该有另一个线程提到了一个堆栈帧,该堆栈帧持有具有相同 ID 的锁。


推荐阅读