Tomcat Console日志引起应用挂起

问题背景

给客户新开发的同步服务,其实就是采用Quartz的写的定时任务,由运维部署到客户的服务器之后总是时不时出现应用卡住不动的问题。具体现象是在windows server下启动Tomcat,Tomcat弹出的Console一开始正常刷着日志,隔一段不固定的时间就有同事报告“Tomcat Console的日志莫名停住了,定时任务也卡住不执行,而且不报任何异常信息”。

问题分析

卡住了就要看看卡在哪里了,通过jvisualvm查看线程信息

红框标记处可以看到锁0x00000007f010fc50一直被RootLogger占用着,而其他任务线程一直在等待获取这个锁。

问题解决

为了尽快恢复服务,先关闭了Console日志打印,经过观察终于不在卡死了。但是是什么原因导致卡住的呢?

找出原因

On Windows, if you click in the console window, this will pause the console, e.g. the stdout buffer will fill up, and as the console appender writes serially, your application will hang until you release the console (press enter or so).

在Windows中,如果点击了console窗口控制台将会暂停住,如果console appender不停连续的写,那么标准输出缓冲区会被填满,你的应用就会hang住直到释放console(按下回车释放)。

见:Stack Overflow