【问题标题】:java stacktrace show a blocked thread without information about what is blocking itjava stacktrace 显示一个被阻塞的线程,没有关于阻塞它的信息
【发布时间】:2012-03-08 07:05:25
【问题描述】:

有人可以解释一下为什么在 jstack 捕获的热点堆栈跟踪中,我看到一个线程 在没有任何关于锁定记录的信息的情况下被阻止意味着什么 阻止它。

3 "ajp-0.0.0.0-8029-1082" daemon prio=10 tid=0x63721000 nid=0x2cba
waiting for monitor entry [0x4e619000]
4    java.lang.Thread.State: BLOCKED (on object monitor)
5         at java.lang.Class.forName0(Native Method)
6         at java.lang.Class.forName(Class.java:186)
7         at com.my.security.SecurityMethodInterceptor$Rule.isAllowed(SecurityMethodInterceptor.java:102)
8         at com.my.security.SecurityMethodInterceptor.isAllowed(SecurityMethodInterceptor.java:163)
9         at com.my.security.SecurityMethodInterceptor.invoke(SecurityMethodInterceptor.java:140)

10 在 ... 删除,因为它不相关

【问题讨论】:

    标签: java synchronization stack-trace


    【解决方案1】:

    在那个堆栈的某个地方,在你切断的部分,是这样的:

    - waiting to lock <0xa3cd2188> (a java.lang.Object)
    

    试试这个简单的应用程序,它有一个线程打印出它要等待的线程,然后等待一段时间。然后,您可以kill -3 &lt;pid&gt;它(在 linux 上)获取其完整的线程转储,包括所有堆栈,包括等待线程的堆栈。

    public class TTest {
        public static void main(String[] args) throws Exception {
            final Object lock = new Object();
            Thread thread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Locking on: " + Integer.toString(lock.hashCode(), 16));
                    synchronized (lock) {
                        System.out.println("Hello, world!");
                    }   
                }   
            };  
            synchronized (lock) {
                thread.start();
                Thread.sleep(600 * 1000);
                System.out.println("bye!");
            }   
        }   
    } 
    

    【讨论】:

    • 希望在其他跟踪中,您将能够看到锁定 0x4e619000 的原因
    • 您示例中的堆栈跟踪清楚地显示了线程的阻塞,您将在线程的堆栈跟踪中看到类似waiting to lock &lt;7f31026a8&gt; (a java.lang.Object) 的行
    • 如果存在,“等待锁定”行将是紧跟在线程转储顶部帧之后的行,就在forName0() 调用之后。但它不存在,它应该存在。这就是这个问题的重点:为什么它不见了?
    • @erickson 啊,好点子。我用谷歌搜索了一下,发现another SO question 发现了同样的问题。看起来这可能是由于内存压力太大而导致的错误。
    • 在您的示例中,您的线程处于 WAITING 状态,但没有像所讨论的那样处于 BLOCKED 状态。
    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多