我们的 Java(Web)应用程序在 JBoss 6x 中运行。当报告缓慢时:
- 线程堆栈转储被采取(详情如下)
- 检查内存 - 发现内存使用率非常高,几乎接近最大允许堆大小,但没有内存不足。
线程堆栈转储显示大多数线程在日志记录中被这些类型的错误阻塞:
waiting for monitor entry [0x000000004b6be000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.jboss.logmanager.handlers.WriterHandler.doPublish(WriterHandler.java:59)
- waiting to lock <0x00002aaac9a2de68> (a java.lang.Object)
at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:64)
像这样:
java.lang.Thread.State: BLOCKED (on object monitor)
at java.io.PrintStream.println(PrintStream.java:756)
- waiting to lock <0x00002aaac9817a08> (a com.whatever.SomeClass)
at com.something.ThatClass.thatMethod(ThatClass.java:169)
com.whatever.SomeClass 使用 org.apache.log4j.Logger
我们使用 Log4j 进行日志记录。
似乎线程在某些日志记录操作上都被阻塞了。这个问题过去也发生过,而且似乎是随机的,它会减慢/停止应用程序。
有任何想法吗?