我到处寻找解决方案,现在我开始怀疑它是否真的是一个问题。
我将log4j2
作为记录器引入我的应用程序,当我这样做时,在重新加载,取消部署或停止Tomcat服务器8.5.24时,会留下内存泄漏,这只会发生一旦我将记录器引入代码中。
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>
我的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();
}
}
我的log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console">
<PatternLayout pattern="%d %p %c %m%n" />
</Console>
<File name="File" bufferedIO="true" fileName="logs/log4j2-file-sync-${date:HH:MM:ss.SSS}.log">
<PatternLayout pattern="%d %p %c %m%n" />
</File>
</Appenders>
<Loggers>
<Root level="all" includeLocation="false">
<AppenderRef ref="Console" />
<AppenderRef ref="File" />
</Root>
</Loggers>
</Configuration>
这是我得到的错误:
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
答案 0 :(得分:2)
回答我自己的问题,感谢来自评论的@RemkoPopma和来自Tomcat JIRA董事会的@RalphGoers的建议。
我只需要pom.xml
中的以下依赖项,它还会导入core
和api
,并处理Log4J2的正常关闭。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.10.0</version>
</dependency>
可以找到此依赖关系的特定文档