0

我的 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 上

谢谢

4

1 回答 1

0

对我来说看起来不像死锁:应用程序完全利用了所有三个内核。此外,似乎应用程序在 log4j 中遇到了锁争用,因此大多数线程大部分时间都在等待 log4j appender 被当前使用它的线程释放。

于 2013-02-11T09:32:32.583 回答