Tomcat8内存泄漏

当我尝试在Java 8上停止tomcat8时,出现一些内存泄漏" title="内存泄漏">内存泄漏错误:

org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:

java.lang.Object.wait(Native Method)

java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142)

com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:40)

23-Jan-2015 08:18:10.202 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [pool-5-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread

23-Jan-2015 08:18:10.205 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [com.util.ThreadLocalProperties$1] (value [com.util.ThreadLocalProperties$1@2fafda6e]) and a value of type [java.util.Properties] (value [{}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

ThreadLocalProperties类是:

public class ThreadLocalProperties extends Properties {

private static final long serialVersionUID = -4260632266508618756L;

private final ThreadLocal<Properties> localProperties = new ThreadLocal<Properties>() {

@Override

protected Properties initialValue() {

return new Properties();

}

};

public ThreadLocalProperties(Properties properties) {

super(properties);

}

@Override

public String getProperty(String key) {

String localValue = localProperties.get().getProperty(key);

return localValue == null ? super.getProperty(key) : localValue;

}

@Override

public Object setProperty(String key, String value) {

return localProperties.get().setProperty(key, value);

}

public ThreadLocal<Properties> getThreadLocal() {

return localProperties;

}

}

然后像这样启动和停止它:

@WebListener()

public class GeneralListener implements ServletContextListener {

ThreadLocalProperties threadLocalProperties = new ThreadLocalProperties(System.getProperties());

@Override

public void contextDestroyed(ServletContextEvent arg0) {

threadLocalProperties.getThreadLocal().remove();

}

@Override

public void contextInitialized(ServletContextEvent arg0) {

System.setProperties(threadLocalProperties);

}

}

为什么我会收到所有这些内存泄漏错误?同样,当我运行关闭程序时,它不会关闭它,我必须手动终止该进程。

怎么了?

回答:

不用担心。这是tomcat在检测到应用程序已启动Thread或自己创建的应用程序时输出的标准消息ThreadLocal。如果你终止关闭线程并删除

threadlocals 时不再需要它们,那么就没有问题。

为什么我会收到所有这些内存泄漏错误?同样,当我运行关闭程序时,它不会关闭它,我必须手动终止该进程。

我已经看到了这种现象,当应用程序启动时ScheduledExecutor(但是其他任何Thread/

都会发生这种情况TheadPool),并且没有关闭它contextDestroyed。因此,请检查您是否在应用程序/服务器停止时关闭线程。

为什么服务器不会停止:JDBC驱动程序在JVM中注册为单例,并与所有Web应用程序共享。更多信息在这里。最好的解决方案是将MySQL驱动程序移动到Tomcat的/lib文件夹中。如果您无法做到这一点,则可以尝试一下,但这更像是骇客,而不是真正的解决方案。

以上是 Tomcat8内存泄漏 的全部内容, 来源链接: utcz.com/qa/423475.html

回到顶部