On 21/07/2016 18:17, Berneburg, Cris J. - US wrote:
> From: Mark Thomas [mailto:ma...@apache.org]

<snip/>

> Using the Find Leaks button on the Tomcat Manager page on old app versions to 
> trigger full garbage collection revealed that the memory leak started to 
> happen in the release when Log4J2 was added to the app.  It did not start 
> happening in the prior release when Mybatis was added.

It isn't essential but that is a good idea to do that to give you an
idea of what you are looking for.

>> This should help:
>> http://markmail.org/message/fcbvwapt6afyndxn
> 
>> 1. Find an app that you can't reload without OOME
>> 2. Get a profiler [...]
>> 3. Reload you app once
>> 4. Use the profiler to look for instances of WebappClassLoader
>> 5. Look for the one with the started attribute == false
>> 6. Trace the GC roots for this instance
> 
> 
> Used the Java Visual VM to pull a heap dump after the app restart and GC.  
> Used Eclipse Memory Analyzer to analyze the heap dumps.  Found the 
> WebappClassLoader with started == false and used Path to GC roots:
> 
> <classloader> org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean ... 
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector
> 
> <classloader> org.apache.logging.log4j.core.jmx.LoggerContextAdmin ... 
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector
> 
> <classloader> org.apache.logging.log4j.core.jmx.StatusLoggerAdmin ... 
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector

The three above look problematic.

> referent java.util.WeakHashMap$Entry ... java.lang.reflect.Proxy

That should disappear once the problematic entries have been fixed

> <classloader> $Proxy3 ... java.lang.reflect.Proxy

That looks to be related to the previous GC root and should also
disappear once the problematic entries are fixed.

> referent java.util.WeakHashMap$Entry ... 
> org.apache.juli.ClassLoaderLogManager ... (many java.util.logging.*)

Again, those will disappear once the issues are fixed. They are Tomcat's
internal logging

> I don't see anything pointing back to our code.  With no previous experience 
> with heap analysis on my part, it looks to me to be due to Log4J2.

Agreed.

>  Changing the args for the call to LogManager.getLogger from Class<T> clazz 
> to none made no appreciable difference.

I wouldn't expect that to make any difference.

>  (Did I somehow set up Log4J2 incorrectly to get it to misbehave?)

I don't think so.

>  Not sure what else I can do.  Report it to the Log4J2 dev group perhaps?

Ask on their users' list. It may be that when you use log4j2 in a webapp
there is some clean-up method you need to call from a
ServletContextListener.

>> One thing worth noting. Yourkit offers two types of heap dumps.
>> You don't want YourKit's own. There is a JVM bug that prevents
>> some GC roots from being shown in that format and if your leak
>> traces back to one of those you can end up scratching your head
>> for days.
>>
>> Mark
> 
> 
> Is there a likely chance that the bug interfered with my usage of Java Visual 
> VM and Eclipse Memory Analyzer and thus prevented me from determining the 
> real problem source?

No. The bug just hides GC roots. If the only GC roots you see are for
weak references then you might have hit this bug.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to