[ 
https://issues.apache.org/jira/browse/LOG4J2-570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13945108#comment-13945108
 ] 

Scott commented on LOG4J2-570:
------------------------------

Thank you for looking into this Matt.  I had a feeling the solution to this 
issue may be constrained due to existing design and hooks w.r.t to servlet 
containers.  It is unfortunate detection can not be done prior to adding the 
hook as Remko suggested.  I believe the servlet container is a common enough 
use case for java applications to mark the issue as a no-fix, but at least 
there is a proposed workaround (*see followup).  The unfortunate part is that 
leak will likely go undetected until disaster strikes (PermGen exhausted), and 
may be difficult to diagnose for some developers in the servlet use-case.

Given the current state of affairs it may be beneficial to reference the 
logback code base. They provide an accessor to the LoggerContext for which the 
stop method can be invoked 
(http://logback.qos.ch/manual/configuration.html#stopContext) to explicitly 
cleanup.  More importantly they have figured out a way to either not start 
certain aspects of the infrastructure or clean up without explicit 
configuration or even explicitly closing the LoggerContext as described in 
their documentation (see code attached which uses logback-classic but does not 
close LoggerContext).

*Can you clarify the proposed workaround?  Is the workaround to add an 
attribute to the "log4j2.xml" <Configuration> element which is 
'shutdownHook="disable"'?  Is there anything else that needs to be done as I am 
still seeing a memory leak but with 1 layer of referencing removed.  To clarify 
the an instance of "org.apache.logging.log4j.core.jmx.LoggerContextAdmin" 
classloader is now the only class which still has hard references that remain 
(to "org.apache.catalina.loader.WebappClassLoader") and is preventing GC from 
cleaning up resources.


> Memory Leak
> -----------
>
>                 Key: LOG4J2-570
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-570
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0-rc1
>         Environment: Ubuntu 12.04
> Linux bos-lpuv7 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 17:37:58 UTC 2013 
> x86_64 x86_64 x86_64 GNU/Linux
> 8 GB RAM
> java version "1.7.0_51"
> Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
> Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
> JAVA_OPTS=-Xmx1024m -Dsun.net.inetaddr.ttl=60 
> -Dsun.net.inetaddr.negative.ttl=60 -Djava.net.preferIPv4Stack=true 
> -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC 
> -XX:+CMSClassUnloadingEnabled
> <log4j.version>2.0-rc1</log4j.version>
> log4j-api
> log4j-core
> log4j-jcl
> Spring webmvc 4.0.2.RELEASE application (simple hello world) deployed in 
> tomcat7.0.52 container.
>            Reporter: Scott
>            Assignee: Matt Sicker
>            Priority: Blocker
>             Fix For: 2.0-rc2
>
>         Attachments: spring_log4j2_memory_leak.tbz2
>
>
> Dynamically loading a JAR that uses log4j2 results in a memory leak when the 
> JAR is unloaded.  This can be observed by deploying a web application to 
> tomcat7 and exercising the stop, undeploy, or redeploy actions.  The memory 
> leak is believed to be caused by log4j for the following reasons:
> 1)Heap Dump reveals the classloader instance responsible for the WAR plugin 
> (of type org.apache.catalina.loader.WebappClassLoader) has 2 non weak/soft 
> reference which are of type 
> (org.apache.logging.log4j.core.LoggerContext$ShutdownThread) and 
> (org.apache.logging.log4j.core.jmx.LoggerContextAdmin) after the WAR has been 
> stopped or undeployed.
> 2)Using SLF4J (slf4j-api, jcl-over-slf4j) to logback-classic logging output 
> is equivalent but all memory is gc as expected (the 
> org.apache.catalina.loader.WebappClassLoader which loaded the WAR is no 
> longer referenced by any hard references)
> 3)Using the SLF4J NOP logger implementation all memory is gc as expected (the 
> org.apache.catalina.loader.WebappClassLoader which loaded the WAR is no 
> longer referenced by any hard references)
> This may not be unique to 2.0rc-1 and I have seen similar behavior in 
> previous 2.0 beta releases.
> This is reproducible with a very simple spring hello world application.  Code 
> and/or heap dumps can be provided upon request.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-dev-h...@logging.apache.org

Reply via email to