Details
Description
I'm introducing log4j2 as the logger into my application and when I do that, on a reload, undeploy or stop of the Application, a memory leak is left, which only happens once I introduce the logger into the code.
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): /myapp
My log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="trace"> <Appenders> <Console name="Console"> <PatternLayout pattern="%d %p [%c] %m%n" /> </Console> <File name="File" bufferedIO="true" fileName="${env:CATALINA_BASE}/logs/app-${date:yyyy-mm-dd}.log"> <PatternLayout pattern="%d %p %m%n" /> </File> </Appenders> <Loggers> <Root level="all" includeLocation="false"> <AppenderRef ref="Console" /> <AppenderRef ref="File" /> </Root> </Loggers> </Configuration>
My dependencies in pom.xml:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.10.0</version> </dependency>
My WebServlet:
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "Servlet", urlPatterns = {"/servlet"}, loadOnStartup = 1) public class Servlet extends HttpServlet { private final Logger logger = LogManager.getLogger(Servlet.class); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.info("doGet"); PrintWriter out = response.getWriter(); out.print("Servlet loaded"); out.flush(); out.close(); } }