Java 我们是否可以保证给定线程显示的堆栈跟踪及其头描述(在线程转储中)总是一致的?
当进行线程转储时,我们是否确定我们得到的结果必然是一致的?我的意思是,如果它告诉我它被阻止了,它真的被阻止了吗Java 我们是否可以保证给定线程显示的堆栈跟踪及其头描述(在线程转储中)总是一致的?,java,jvm,thread-dump,Java,Jvm,Thread Dump,当进行线程转储时,我们是否确定我们得到的结果必然是一致的?我的意思是,如果它告诉我它被阻止了,它真的被阻止了吗 "subscription-akka.actor.default-dispatcher-16" #165 prio=5 os_prio=31 tid=0x00007fce799da000 nid=0xd70b waiting for monitor entry [0x0000700006b01000] java.lang.Thread.State: BLOCKED (on obj
"subscription-akka.actor.default-dispatcher-16" #165 prio=5 os_prio=31 tid=0x00007fce799da000 nid=0xd70b waiting for monitor entry [0x0000700006b01000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.Formatter$Flags.parse(Formatter.java:4439)
at java.util.Formatter$FormatSpecifier.flags(Formatter.java:2640)
at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2709)
这似乎很荒谬(我正在使用的OpenJDK 8/Zulu上的这个类最近似乎没有任何变化)
对观察到的行为有(其他)好的解释吗
谢谢我希望行号是错误的,而不是
阻塞的
状态。或者正在进行检测。毕竟,这一行上有一个分配,一个记录分配的监视工具可能会导致阻塞。一个有趣的方法是检查其他哪个线程有指定的监视器和wha该线程正在运行。@Holger I CTRL-F表示“锁定”或“同步”,但在整个文件中找不到任何内容。您的建议很好,我将看看是否可以获得整个线程转储。可能是这样的:
public static Flags parse(String s) {
char[] ca = s.toCharArray();
->>> here Flags f = new Flags(0);
for (int i = 0; i < ca.length; i++) {
Flags v = parse(ca[i]);