记录器上阻止的Java线程

记录器上阻止的Java线程,java,multithreading,logging,jboss,log4j,Java,Multithreading,Logging,Jboss,Log4j,我们的Java(Web)应用程序在JBoss6x中运行。 报告缓慢时: 已进行线程堆栈转储(详细信息如下) 检查内存-发现内存使用率非常高,几乎达到允许的最大堆大小,但没有内存不足 线程堆栈转储显示了日志记录时被阻止的大多数线程,其中包含以下类型的错误: waiting for monitor entry [0x000000004b6be000] java.lang.Thread.State: BLOCKED (on object monitor) at org.jboss.log

我们的Java(Web)应用程序在JBoss6x中运行。 报告缓慢时:

  • 已进行线程堆栈转储(详细信息如下)
  • 检查内存-发现内存使用率非常高,几乎达到允许的最大堆大小,但没有内存不足
  • 线程堆栈转储显示了日志记录时被阻止的大多数线程,其中包含以下类型的错误:

    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)
    
    等待监视器条目[0x000000004b6be000]
    java.lang.Thread.State:阻塞(在对象监视器上)
    位于org.jboss.logmanager.handlers.WriterHandler.doPublish(WriterHandler.java:59)
    -等待锁定(java.lang.Object)
    位于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)
    
    java.lang.Thread.State:已阻止(在对象监视器上)
    在java.io.PrintStream.println(PrintStream.java:756)
    -等待锁定(com.whatever.SomeClass)
    在com.something.ThatClass.thatMethod上(ThatClass.java:169)
    
    com.whatever.SomeClass使用org.apache.log4j.Logger
    我们使用Log4j进行日志记录

    似乎在某些日志记录操作中所有线程都被阻塞。 这个问题在过去也发生过,而且似乎是随机的,它会减慢/停止应用程序


    有什么想法吗?

    Jasper,所有日志框架都有一个同步块,用于将数据写入磁盘。这是为了防止在多个线程写入日志时对日志造成混乱(您在
    java.io.PrintStream.println
    上发布了一个示例-阻塞的线程)

    但有一个解决办法,那就是使用。在工作中,我们有一些高吞吐量/低延迟的应用程序,我们必须对此进行配置以防止线程争用


    在使用async appender时,需要考虑的一点是,如果应用程序崩溃或被强制终止,您将无法在日志中看到最后的日志记录语句,因为它们可能没有写入磁盘。

    可能.log文件上的任何文件操作都是并行进行的。请注意,最近对于log4j.xml中的RollingFileAppender,MaxBackupIndex大小已设置为1000(MaxFileSize为5MB)。MaxBackupIndex的如此高的值是否会导致此问题请参阅有关AsyncAppender问题和技巧的信息,以进一步减少争用。大多数日志框架都具有同步化块,其中日志条目排队到日志写入线程。锁定完整的磁盘写入操作将非常糟糕。Martin,只有在使用异步appender时才是这样。如果使用普通的文件或控制台追加器,那么日志框架将同步阻止任何其他日志操作。这就是为什么会有一个异步appender,它反过来会环绕另一个appender。