当前位置: 首页 > 知识库问答 >
问题:

log4j2-ServletContextListener中的ThreadLocal内存泄漏

百里嘉泽
2023-03-14

当关闭Tomcat时,我得到以下错误:

严重:web应用程序[App]创建了一个ThreadLocal,其键类型为[org.apache.logging.log4j.core.layout.PatternLayout$1](值为[org.apache.logging.log4j.core.layout.PatternLayout$1@14391AAF]),值类型为[java.lang.StringBuilder](值为[2015-09-30 14:22:27.832[localhost-startStop-1]ERROR AppLogger-ERROR log.]),但在web应用程序停止时未能删除它。线程将随着时间的推移而更新,以避免可能的内存泄漏。

只有当我试图在ServletContextListener实现中的contextInitialized或contextDestroyed方法中记录一些内容时,它才会出现。一旦Tomcat启动,日志记录在应用程序的其余部分都可以正常工作。我注意到StringBuilder的值总是记录的最后一个条目。在这种情况下,以下代码生成日志:

@Override
public void contextInitialized(ServletContextEvent arg0)
{
    Logger logger = LogManager.getLogger("AppLogger");
    logger.error("Error log.");
}

经过几个小时的调查(包括这样),我仍然找不到一个解释。这是Log4j2初始化问题吗?这是我应该报告的bug吗?

我在Eclipse 4.5中使用Tomcat 8.0

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   version="3.0">

<context-param>
    <param-name>log4jContextName</param-name>
    <param-value>App</param-value>
</context-param>

</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- http://logging.apache.org/log4j/2.x/manual/configuration.html -->
<Appenders>
    <File name="File" fileName="/home/user/app.log">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
    <Console name="Console">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
</Appenders>
<Loggers>
    <Logger name="AppLogger" level="ALL">
        <AppenderRef ref="File"/>
    </Logger>
    <Root level="ALL">
        <AppenderRef ref="Console"/>
    </Root>
</Loggers>
</Configuration>

共有1个答案

阙庆
2023-03-14

这与Log4J2.4中引入的ThreadLocal有关。这是在发布后发现的,并将在下一个版本中修复,该版本将是2.4.1或2.5(我们希望这将很快,在一两周内)。

 类似资料:
  • 我在Tomcat中得到了threadlocal内存泄漏错误,我正在使用ThreadPool,但在我的WebApp中没有threadlocal的实现。 严重:web应用程序[/mywebapp]创建了一个ThreadLocal,其键类型为[org.a pache.http.impl.cookie.dateformatholder$1](值为[org.apache.http.imp l.cookie.

  • 本文向大家介绍ThreadLocal 内存泄露问题?相关面试题,主要包含被问及ThreadLocal 内存泄露问题?时的应答技巧和注意事项,需要的朋友参考一下 ThreadLocalMapThreadLocalThreadLocalThreadLocalMapset()get()remove()ThreadLocalremove()`方法 弱引用介绍: 如果一个对象只具有弱引用,那就类似于可有可无

  • 我们已经设法摆脱了几乎所有的内存泄漏错误消息,但最后一个仍然被困住了。 2014年6月10日下午3:36:15 org.apache.catalina.loader.webappClassLoader checkThreadLocalMapForLeaks严重:web应用程序[/myapp]创建了一个ThreadLocal,其键类型为[com.sun.faces.application.appli

  • 严重:web应用程序[]创建了一个ThreadLocal,其键类型为[com.box.sdk.boxDateFormat$1](值为[com.box.sdk.boxDateFormat$1@275AB696])和值类型为[java.text.SimpleDateFormat](值为[java.text.SimpleDateFormat@faabb360]),但在web应用程序停止时未能删除它。线程

  • 我尝试用一个大表(大约一万条记录)中的记录填充JdbcRowSet。我尝试了两个变体(参见下面的代码): 创建连接对象,使用JdbcRowSetImpl(connection)实例化,在循环中执行查询。 使用JdbcRowSetImpl(DriverManager.GetConnection(“jdbc:....”)实例化,在循环中执行查询。 第一个变体会导致内存泄漏,直到堆满为止。第二个变体没有

  • 我有一个在Tomcat7上运行的web应用程序的问题。 当我尝试重新启动web应用程序时,我在servlet内部创建的线程打开的端口仍然是打开的。 “http-bio-8080-acceptor-0”后台进程prio=10 tid=0x00007F4ED4206000 nid=0x71f0 runnable[0x00007F4ECC78F000]java.lang.thread.state:run