Log4j1.2 --- 死锁

博客讲述了在使用Log4j1.2时遇到的死锁问题,主要原因是多个线程同时写日志导致争夺RootCategory对象的锁。文章提供了线程堆栈信息,揭示了死锁发生在`Category.callAppenders`方法上,且Apache尚未解决该古老bug。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为嘛死锁无处不在啊?出问题的这个进程是做后台计算的,三十个左右的NodeThread,基本上在执行相同的http请求时,依赖的服务没有及时响应,等待一段时间后超时,于是线程们开始写日志。基本上等于三十个线程同时开始记日志,要求获取aorg.apache.log4j.spi.RootCategory 对象的锁。多线程环境下,真是啥都不牢靠。

众网友反映这个问题在log4j 1.2*版的古老bug。至今还没解决...  apache说1.3是个不连续的版本,2.0是实验性质的版本,唉,不靠谱。

还有同学说有些死锁是有些应用层日志api调用得有问题,不是人log4j的问题,那同学代码确实写的很bt,但是和我碰到的问题不是一个问题,就不深入讨论了。 http://mail-archives.apache.org/mod_mbox/logging-log4j-user/200810.mbox/%3C48FC8556.7020804@corporater.com%3E

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------

 

有stack有真相。

一个线程

 "Thread-2174" daemon prio=10 tid=0x00000000506a3000 nid=0x7a2 runnable [0x00000000452f8000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileOutputStream.writeBytes(Native Method)
        at java.io.FileOutputStream.write(FileOutputStream.java:260)
        at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
        - locked <0x00002aaab3611fb0> (a java.io.BufferedOutputStream)
        at java.io.PrintStream.write(PrintStream.java:430)
        - locked <0x00002aaab3611f78> (a java.io.PrintStream)
        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
        at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276)
        at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)
        - locked <0x00002aaab589f280> (a java.io.OutputStreamWriter)
        at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212)
        at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:49)
        at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:306)
        at org.apache.log4j.WriterAppender.append(WriterAppender.java:150)
        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:221)
        - locked <0x00002aaab589e658> (a org.apache.log4j.ConsoleAppender)
        at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:57)
        at org.apache.log4j.Category.callAppenders(Category.java:187)
        - locked <0x00002aaab5838af0> (a org.apache.log4j.spi.RootCategory)
        at org.apache.log4j.Category.forcedLog(Category.java:372)
        at org.apache.log4j.Category.info(Category.java:674)
        at com.wps.www.oaas.ftr.dispatcher.task.XLiveIndexWorker_Optimize.doIndex(XLiveIndexWorker_Optimize.java:278)
        at com.wps.www.oaas.ftr.dispatcher.task.XLiveIndexWorker_Optimize.doIndexes(XLiveIndexWorker_Optimize.java:185)
        at com.wps.www.oaas.ftr.dispatcher.task.XLiveTaskWorker.doWork(XLiveTaskWorker.java:23)
        at com.wps.www.oaas.ftr.dispatcher.node.NodeThread.doWork(NodeThread.java:256)
        at com.wps.www.oaas.ftr.dispatcher.node.NodeThread.run(NodeThread.java:185)

 

其它线程:

"Thread-2169" daemon prio=10 tid=0x0000000050ba0000 nid=0x6480 waiting for monitor entry [0x0000000044bf1000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.log4j.Category.callAppenders(Category.java:185)
        - waiting to lock <0x00002aaab5838af0> (a org.apache.log4j.spi.RootCategory)
        at org.apache.log4j.Category.forcedLog(Category.java:372)
        at org.apache.log4j.Category.info(Category.java:674)
        at com.wps.www.oaas.ftr.dispatcher.task.XLiveIndexWorker_Optimize.doIndex(XLiveIndexWorker_Optimize.java:278)
        at com.wps.www.oaas.ftr.dispatcher.task.XLiveIndexWorker_Optimize.doIndexes(XLiveIndexWorker_Optimize.java:185)
        at com.wps.www.oaas.ftr.dispatcher.task.XLiveTaskWorker.doWork(XLiveTaskWorker.java:23)
        at com.wps.www.oaas.ftr.dispatcher.node.NodeThread.doWork(NodeThread.java:256)
        at com.wps.www.oaas.ftr.dispatcher.node.NodeThread.run(NodeThread.java:185)

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值