我的 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 状态的日志消息找到一个。
- 为什么是 300% 的 CPU?这是一个 JVM 的东西,最多可以使用核心数 - 1 个线程吗?
- 什么会导致死锁?我正在使用最新的 log4j.jar。该问题仅发生在 tomcat 6.0.35/java 1.6.0_31-b04 上,而不发生在 tomcat 6.0.18/java 1.6.0_17-b04 上
谢谢