四核CPU上的Java(log4j)死锁。为什么300%CPU?

时间:2013-02-11 09:18:07

标签: java tomcat log4j deadlock

我的Tomcat网站偶尔会挂起。当我转储堆栈跟踪时,我看到最多200个线程,如下所示:

"TP-Processor200" daemon prio=10 tid=0x00007fddf062a800 nid=0x4bce waiting for monitor entry [0x00007fdd5020b000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at org.apache.log4j.Category.callAppenders(Category.java:204)
    - waiting to lock <0x00000007808d3a88> (a org.apache.log4j.spi.RootLogger)
    at org.apache.log4j.Category.forcedLog(Category.java:391)

然后java进程消耗300%的CPU。我期待看到三个线程处于RUNNING状态,但我找不到。相反,我为每个处于BLOCKED状态的日志消息找到一个。

  1. 为什么300%的CPU?这是一个JVM的东西,可以使用核心数 - 1个线程吗?
  2. 什么可能导致死锁?我正在使用最新的log4j.jar。问题只发生在tomcat 6.0.35 / java 1.6.0_31-b04,而不是tomcat 6.0.18 / java 1.6.0_17-b04
  3. 由于

1 个答案:

答案 0 :(得分:0)

对我来说看起来不像死锁:应用程序完全利用所有三个核心。此外,似乎应用程序在log4j中遭受锁争用,因此大多数时候大多数线程都在等待当前正在使用它的线程释放log4j appender。