When the log4j2 jar files are in $catalina.home/lib, the first web application that is loaded will be reported by Tomcat as having a memory leak from loaded classes.
1. Steps to reproduce
- Install Tomcat 7.0.65 afresh
- Copy log4j-api-2.5-SNAPSHOT.jar, log4j-core-2.5-SNAPSHOT.jar, log4j-web-2.5-SNAPSHOT.jar into $catalina.home/lib.
- (Optional) place a log4j2.xml config file with status="true" in $catalina.home/lib. This helps to confirm that the web app which is loaded first causes the warning.
- Edit $catalina.home/conf/catalina.properties: add log4j2.disable.jmx=true (eliminate JMX as the culprit)
- Edit $catalina.home/conf/tomcat-users.xml to give yourself permission to access the Tomcat Web App Manager
- Start Tomcat
- Open the Manager App
- Reload the Tomcat Documentation (/docs) web app
- Click the "Find Leaks" button under Diagnostics at the bottom of the Manager App page
The following warning is displayed:
The following web applications were stopped (reloaded, undeployed), but their classes from previous runs are still loaded in memory, thus causing a memory leak (use a profiler to confirm):
2. Use custom web app to prove the web app loaded first always has this issue
Use the attached web app to test the order of deployment.
- Restart Tomcat
- Deploy web app (containing its own log4j2.xml)
- Restart Tomcat again (note that the custom web app is loaded first)
- Reload /docs app: no memory leak
- Reload /webapp: gives memory leak warning
- Undeploy custom web app
- Restart Tomcat ( /docs web app is loaded first)
- Deploy custom web app
- Reload /docs app: gives memory leak warning
- Reload /webapp: no memory leak
I have tried to use Eclipse Memory Analyzer to find out where the leak is, but without success.
(Note that the problem also happens with the default configuration (when no log4j2.xml config is found), this may narrow things down a little... Perhaps this has something to do with the StatusLogger?)