【发布时间】:2017-02-15 14:20:18
【问题描述】:
我使用 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 调试 Log4jServletContextListener 确保 Log4j 正确关闭。 2016-10-22 13:49:36,382 localhost-startStop-2 调试开始 LoggerContext[名称=bb4719, org.apache.logging.log4j.core.LoggerContext@d77214]...
实际上在我的应用程序中,我在 web.xml 中使用了 spring ContextLoaderListner,因此它可能会在销毁 spring listner 的同时在内部使用日志记录。
谢谢
【问题讨论】:
-
你能粘贴 catalina 属性还是只粘贴 log4j 的行?
-
我已经查看了 log4j2-1259,我没有正确得出结论。
-
log4j-web.jar丢失导致关闭挂钩无法正确执行。其他人也有同样的问题,但在他们的情况下,他们使用了一些旧的 catalina 属性,其中 log4j jar 被忽略了。
标签: java log4j2 tomcat8 java-threads