有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

log4j2线程的java Tomcat内存泄漏问题

我使用log4j2进行日志记录,tomcat8和java8版本。 我使用属性“monitorInterval”定期检查日志4J2。xml。 在关闭tomcat的过程中,我面临内存泄漏的问题。如何解决这个内存泄漏问题

以下是catalina日志:

06-Oct-2016 15:13:55.927 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [mywebapp] appears to have started a thread named [Log4j2-Log4j2Scheduled-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: sun.misc.Unsafe.park(Native Method) 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销毁后,logger上下文再次初始化

2016-10-22 13:49:36,347 localhost-startStop-2 DEBUG Log4jServletContextListener ensuring that Log4j shuts down properly. 2016-10-22 13:49:36,382 localhost-startStop-2 DEBUG Starting LoggerContext[name=bb4719, org.apache.logging.log4j.core.LoggerContext@d77214]...

实际上,在我的应用程序中,我在web中使用spring ContextLoaderListner。因此,它可能会在销毁spring listner的同时在内部使用日志记录

谢谢


共 (1) 个答案

  1. # 1 楼答案

    应该行得通

    确保在构建中包含log4j-web

    比如maven依赖

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
    </dependency>
    

    如果您使用的是servlet 3.0或更高版本的容器(如Tomcat 8),则不需要额外的配置(只要您没有忽略Tomcat,以便在某些JAR中扫描ServletContainerInitializer)。有关更多信息,请参见Using Log4j 2 in Web Applications


    更新

    我已经用你的设置(Tomcat 8.0.38,Log4j-2.6.2)试过了,效果很好。要检查Log4jServletContextListenerLog4jServletFilter是否已初始化,请在log4j2.xml中将StatusLogger级别设置为DEBUG

    <Configuration monitorInterval="30" status="DEBUG">
    

    之后,在部署应用程序时,您应该能够在根记录器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.
    

    如果你看不到日志。你应该检查一下你的catalina。属性,如果jarsToSkip包含任何log4j2的jar,或者如果您在web中定义了一个isLog4jAutoInitializationDisabled参数,其值为false。xml

    <context-param>
       <param-name>isLog4jAutoInitializationDisabled</param-name>
       <param-value>false</param-value>
    </context-param>