现象:
停止Tomcat时,catalina.log里输出提示信息:SEVERE: The web application [/xxx] appears to have started a thread named [FileWatchdog] but has failed to stop it. This is very likely to create a memory leak.
原因:
导致这个错误的原因是在web.xml里配置了:
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
所以,启动Tomcat的同时启动了一个检测log4j.properties变化的线程,但在1.2.x版本的log4j实现中,这个线程无法被interrupt,所以会出现这个错误。
事实上,这个错误在2002年的时候就出现了,只不过一直没有被修复,详情可参考:
ASF Bugzilla – Bug 4913 org.apache.log4j.helpers.FileWatchdog should allow external interrupt()
log4j官方原先计划在1.3版本中修复,但后来,就没有后来的1.3版本了,直接到了2.x版本。1.2.x版本和2.x版本之间不兼容,无法平滑升级。
解决办法:
1、将log4j升级到2.x版本;
2、去掉自动检测这个配置(事实上95%以上的场景都没有必要);
3、自己写个ServletContextListener强行中止该线程。
参考资料:tomcat filewatchdog but has failed to stop it原因以及解决方法
看美剧,就上 http://www.ustvseries.cn/