org.apache.log4j.Category.callAppenders上的线程BLOCKED,但不等待任何锁定

时间:2015-01-04 06:39:08

标签: java multithreading log4j

我的网络应用程序(在weblogic上运行)发生故障,当我检查jstack信息时,我发现org.apache.log4j.spi.RootLogger上的大多数线程都是BLOCKED。拥有这个锁的线程也被阻塞并且被卡住了至少20分钟,直到我杀死进程,但它没有等待任何其他锁定,这是怎么发生的?

这里是jstack信息:

BLOCKED线程拥有锁< 783b8910>,但不等待其他锁:

"[STUCK] ExecuteThread: '58' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=7 tid=02e45400 nid=86 lwp_id=7959740 waiting for monitor entry [61cff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:201)
- locked <783b8910> (a org.apache.log4j.spi.RootLogger)
at org.apache.log4j.Category.forcedLog(Category.java:388)
at org.apache.log4j.Category.error(Category.java:302)

等待锁定的其他线程&lt; 783b8910&gt;:

"[STUCK] ExecuteThread: '36' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=7 tid=02e0ea00 nid=64 lwp_id=7959717 waiting for monitor entry [62d7f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:201)
- waiting to lock <783b8910> (a org.apache.log4j.spi.RootLogger)
at org.apache.log4j.Category.forcedLog(Category.java:388)
at org.apache.log4j.Category.error(Category.java:319)

"[STUCK] ExecuteThread: '34' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=7 tid=02e0a200 nid=62 lwp_id=7959715 waiting for monitor entry [62eff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:201)
- waiting to lock <783b8910> (a org.apache.log4j.spi.RootLogger)
at org.apache.log4j.Category.forcedLog(Category.java:388)
at org.apache.log4j.Category.info(Category.java:663)

等等,共有64个线程正在等待锁定&lt; 783b8910&gt;

这种情况每月发生1-3次,我找不到解决方案,因为我不知道为什么拥有锁的线程在没有等待其他锁的情况下被阻塞。

log4j版本是1.2.13

1 个答案:

答案 0 :(得分:0)

在Java Command Windows上,如果单击停止打印日志,则此线程阻塞发生在打印日志时,因此线程在打印日志时进入“阻塞”状态。

因此,如果这是问题,则可以使用AsyncAppender。