我正在尝试分析一个线程转储,它似乎表明有许多线程正在等待java.util.concurrent.Semaphore许可,即线程正在等待Semaphore.acquire()。
我能够暗示因为线程处于等待(停放)状态,而且从我所理解的情况来看,Semaphore不使用LOCK监视器,而是使用LockSupport.park()代替,在另一个线程上等待取消它。
现在,有没有办法从线程转储中暗示所有线程当前持有Semaphore允许的内容?
类似于在BLOCKED状态下查找线程,并检查哪个是持有LOCK的线程导致线程阻塞?
答案 0 :(得分:2)
信号量没有所有权的概念或对线程知之甚少。这使得它们特别轻量级(并且在异步编程中非常有用,其中您的逻辑执行线程和执行它的硬件线程不一定具有1:1映射)。
您还可以从线程可以释放信号量而无需获取它的事实中看到这一点。
你必须查看堆栈跟踪,看看线程在哪些信号量上等待并从那里向后工作。
答案 1 :(得分:1)
有一些工具可以帮助您分析dumps.Yourkit就是一个可以用来分析被阻塞线程的工具。
参考: https://www.yourkit.com/docs/java/help/monitor_profiling.jsp