Uploaded image for project: 'Log4j 2'
  1. Log4j 2
  2. LOG4J2-2167

Memory leak in Apache Tomcat/8.5.24

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Invalid
    • 2.10.0
    • None
    • Web/Servlet
    • None

    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();
          }
      }
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            ccsalway Christian Salway
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: