我正在使用log4j2记录日志,tomcat8和java8版本。我使用"monitorInterval"属性定期检查log4j2.xml。在关闭我的tomcat时,我遇到了内存泄漏的问题。如何解决这个内存泄漏问题?
以下是catalina日志: 06-Oct-2016 15:13:55.927 WARNING [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时可能会在内部使用日志记录。
谢谢。
以下是catalina日志: 06-Oct-2016 15:13:55.927 WARNING [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.jar
文件丢失,导致关闭挂钩无法正常执行。其他人也遇到了同样的问题,但在他们的情况下,他们使用了一些旧的catalina属性,其中忽略了log4j jars。 - bhantol