【发布时间】:2014-10-07 19:56:09
【问题描述】:
一个简单的基于 Spring 的 war 应用程序,带有典型的 log4j2.xml。当 JBoss 正常关闭时,它会挂起并在 log4j2 中出现线程死锁,因此关闭过程永远不会完成,必须终止该进程。 JBoss 是 EAP 6.3 (AS 7.4.0),JDK 是 1.8.0_20。
有什么可以做的吗?
Log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<RollingFile name="file" append="true"
fileName="myapp.log"
filePattern="myapp-$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log" >
<PatternLayout pattern="%d{DEFAULT} %-5p [%t] %c - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="5000"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="file"/>
</Root>
</Loggers>
</Configuration>
下面的线程转储。
Found one Java-level deadlock:
=============================
"ServerService Thread Pool -- 110":
waiting to lock monitor 0x000000001f884068 (object 0x00000000c412bff0, a org.apache.log4j.ConsoleAppender),
which is held by "MSC service thread 1-10"
"MSC service thread 1-10":
waiting to lock monitor 0x000000001d75ee88 (object 0x00000000c06805a0, a java.io.PrintStream),
which is held by "log4j-shutdown"
"log4j-shutdown":
waiting to lock monitor 0x000000001f884068 (object 0x00000000c412bff0, a org.apache.log4j.ConsoleAppender),
which is held by "MSC service thread 1-10"
Java stack information for the threads listed above:
===================================================
"ServerService Thread Pool -- 110":
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:231)
- waiting to lock <0x00000000c412bff0> (a org.apache.log4j.ConsoleAppender)
at org.apache.log4j.JBossAppenderHandler.doPublish(JBossAppenderHandler.java:42)
at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:79)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:296)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.Logger.logRaw(Logger.java:721)
at org.jboss.logmanager.Logger.log(Logger.java:672)
at org.jboss.logging.JBossLogManagerLogger.doLogf(JBossLogManagerLogger.java:50)
at org.jboss.logging.Logger.logf(Logger.java:2096)
at org.jboss.as.web.WebLogger_$logger.unregisterWebapp(WebLogger_$logger.java:183)
at org.jboss.as.web.deployment.WebDeploymentService.doStop(WebDeploymentService.java:167)
at org.jboss.as.web.deployment.WebDeploymentService.access$100(WebDeploymentService.java:58)
at org.jboss.as.web.deployment.WebDeploymentService$2.run(WebDeploymentService.java:111)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
"MSC service thread 1-10":
at java.io.PrintStream.write(PrintStream.java:478)
- waiting to lock <0x00000000c06805a0> (a java.io.PrintStream)
at org.jboss.stdio.StdioContext$DelegatingPrintStream.write(StdioContext.java:264)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
- locked <0x00000000c412ce30> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:59)
at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:324)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
- locked <0x00000000c412bff0> (a org.apache.log4j.ConsoleAppender)
at org.apache.log4j.JBossAppenderHandler.doPublish(JBossAppenderHandler.java:42)
at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:79)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:296)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.Logger.logRaw(Logger.java:721)
at org.jboss.logmanager.Logger.log(Logger.java:672)
at org.jboss.logging.JBossLogManagerLogger.doLogf(JBossLogManagerLogger.java:50)
at org.jboss.logging.Logger.logf(Logger.java:2096)
at org.jboss.web.CoyoteLogger_$logger.pauseHttpConnector(CoyoteLogger_$logger.java:794)
at org.apache.coyote.http11.Http11Protocol.pause(Http11Protocol.java:235)
at org.apache.catalina.connector.Connector.pause(Connector.java:998)
at org.jboss.as.web.WebConnectorService.stop(WebConnectorService.java:419)
- locked <0x00000000c1014728> (a org.jboss.as.web.WebConnectorService)
at org.jboss.msc.service.ServiceControllerImpl$StopTask.stopService(ServiceControllerImpl.java:2088)
at org.jboss.msc.service.ServiceControllerImpl$StopTask.run(ServiceControllerImpl.java:2049)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
"log4j-shutdown":
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:231)
- waiting to lock <0x00000000c412bff0> (a org.apache.log4j.ConsoleAppender)
at org.apache.log4j.JBossAppenderHandler.doPublish(JBossAppenderHandler.java:42)
at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:79)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:296)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304)
at org.jboss.logmanager.Logger.logRaw(Logger.java:721)
at org.jboss.logmanager.Logger.log(Logger.java:506)
at org.jboss.stdio.AbstractLoggingWriter.write(AbstractLoggingWriter.java:71)
- locked <0x00000000c0680600> (a java.lang.StringBuilder)
at org.jboss.stdio.WriterOutputStream.finish(WriterOutputStream.java:143)
at org.jboss.stdio.WriterOutputStream.write(WriterOutputStream.java:124)
- locked <0x00000000c0680770> (a sun.nio.cs.SingleByte$Decoder)
at java.io.PrintStream.write(PrintStream.java:480)
- locked <0x00000000c06805a0> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
- locked <0x00000000c0680b48> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.write(PrintStream.java:527)
- locked <0x00000000c06805a0> (a java.io.PrintStream)
at java.io.PrintStream.print(PrintStream.java:669)
at java.io.PrintStream.println(PrintStream.java:806)
- locked <0x00000000c06805a0> (a java.io.PrintStream)
at org.jboss.stdio.StdioContext$DelegatingPrintStream.println(StdioContext.java:474)
at org.apache.logging.log4j.status.StatusConsoleListener.log(StatusConsoleListener.java:81)
at org.apache.logging.log4j.status.StatusLogger.logMessage(StatusLogger.java:216)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1336)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1325)
at org.apache.logging.log4j.spi.AbstractLogger.error(AbstractLogger.java:551)
at org.apache.logging.log4j.core.jmx.Server.unregisterAllMatching(Server.java:315)
at org.apache.logging.log4j.core.jmx.Server.unregisterStatusLogger(Server.java:261)
at org.apache.logging.log4j.core.jmx.Server.unregisterLoggerContext(Server.java:234)
at org.apache.logging.log4j.core.jmx.Server.unregisterLoggerContext(Server.java:217)
at org.apache.logging.log4j.core.LoggerContext.stop(LoggerContext.java:225)
at org.apache.logging.log4j.core.LoggerContext$ShutdownThread.run(LoggerContext.java:482)
at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.
【问题讨论】:
标签: java jboss log4j deadlock log4j2