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

kel*_*gon 5 java multithreading log4j

我的web应用程序(在weblogic上运行)发生故障,当我检查jstack信息时,我发现org.apache.log4j.spi.RootLogger上的大多数线程都是BLOCKED.拥有这个锁的线程也被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)
Run Code Online (Sandbox Code Playgroud)

等待锁定的其他线程<783b8910>:

"[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)
Run Code Online (Sandbox Code Playgroud)

"[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)
Run Code Online (Sandbox Code Playgroud)

依此类推,共有64个线程正在等待锁定<783b8910>

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

log4j版本是1.2.13

小智 0

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

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