Tomcat内存泄漏问题的log4j2线程
我正在使用log4j2进行日志记录,tomcat8和java8版本。 我使用属性“monitorInterval”来定期检查我的log4j2.xml。 在关机期间我的tomcat我面临内存泄漏问题。如何解决这个内存泄漏问题?
以下是catalina日志:
2016年10月6日15:13:55.927警告[localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[mywebapp]似乎已经启动了一个名为[Log4j2-Log4j2Scheduled-1]的线程但是未能阻止它。 这很可能造成内存泄漏。 堆栈跟踪线程:sun.misc.Unsafe.park(本机方法)java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.awaitNanos(AbstractQueuedSynchronizer。 java:2078)java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)java.util.concurrent.ThreadPoolExecutor.getTask( ThreadPoolExecutor.java:1067)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)java.lang.Thread.run(Thread。 Java的:745)
提前致谢。
更新:我分析了我的日志,实际记录器上下文在Log4jServletContextListener正在销毁时再次启动..
2016-10-22 13:49:36,347 localhost-startStop-2 DEBUG Log4jServletContextListener确保Log4j正常关闭。 2016-10-22 13:49:36,382 localhost-startStop-2 DEBUG启动LoggerContext [name = bb4719,org.apache.logging.log4j.core.LoggerContext@d77214] …
实际上在我的应用程序中我在web.xml中使用spring ContextLoaderListner,因此它可能在销毁spring listner时在内部使用日志记录。
谢谢
它应该工作。
确保在构建中包含log4j-web
。
例如,作为maven依赖。
org.apache.logging.log4j log4j-web
如果您正在使用servlet 3.0容器或更新(如Tomcat 8中),则无需进行其他配置(只要您没有省略Tomcat以在某些jar中扫描ServletContainerInitializer)。 有关更多信息,请参阅在Web应用程序中使用Log4j 2 。
UPDATE
我已经设置了你的设置(Tomcat 8.0.38,Log4j-2.6.2),它的工作原理。 要检查Log4jServletContextListener
和Log4jServletFilter
是否已初始化,请在StatusLogger
级别设置为DEBUG
。
之后,您应该能够在部署应用程序时看到root logger appender中的以下输出。
2016-10-14 20:21:36,762 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletContextListener ensuring that Log4j starts up properly. 2016-10-14 20:21:36,764 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletFilter initialized.
如果您的应用程序已重新部署,则应在日志中看到以下行。
2016-10-14 20:22:00,276 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletFilter destroyed. 2016-10-14 20:22:00,286 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletContextListener ensuring that Log4j shuts down properly.
如果你没有看到日志。 如果您的jarsToSkip
包含任何jar的log4j2,或者您已在web.xml中定义了值为false
的isLog4jAutoInitializationDisabled
参数,则应检查catalina.properties。
isLog4jAutoInitializationDisabled false