单例log4j死锁

文章内索引
[显示]

静态单例模式下log4j死锁

问题描述:

排查以往项目中一个“卡住”的程序发现了如下问题,此项目结构如图。

图片.png

nettyserver负责从client接收消息,并根据ID启动相应进程。进程并行处理消息时会偶然发生卡住的现象。

通过jstack排查发现由于log4j为单实例,并且多进程访问log4j写入日志会导致阻塞。发生阻塞的关键线程栈信息如下:

main线程为主要的消息监听线程,thread-3线程为处理业务逻辑线程,它等待thread-3线程持有的OutputStreamManager对象时造成了阻塞。并未继续下发任务,导致程序卡住。

 

解决办法:

将log4j对象改为非单例模式,每个class持有一个log4j对象。或非关键进程降低日志级别,生产环境调高日志级别。

 


©版权声明:本文为【翰林小院】(huhanlin.com)原创文章,转载时请注明出处!

发表评论

电子邮件地址不会被公开。