tomcat - Tomcat 6 中的 sun.net.www.http.HttpClient 内存泄漏

标签 tomcat memory-leaks httpclient

我正在使用 Tomcat 6.0.18。在取消部署我的应用程序后,HttpClient 似乎持有对 WebappClassLoader 的引用,因此导致内存泄漏。

经过一些调查,我在 Tomcat 7.0.6 中找到了解决方案,JreMemoryLeakPreventionListener具有 keepAliveProtection 属性。但是这种方法不适用于 Tomcats 6(我自定义了 JreMemoryLeakPreventionListener,以添加对此属性的支持)。

有没有人有解决 Tomcat 6 中这个漏洞的解决方案? 谢谢!

最佳答案

我找到了内存泄漏的解决方案。

必须执行 ServletContextListener ,如下:

package org.example;

public class MyServletContextListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent sce) {
         tomcatLeakPreventionForHttpClient();
    }

    private void tomcatLeakPreventionForHttpClient() {
        try {
            final Field kac = HttpClient.class.getDeclaredField("kac");
            kac.setAccessible(true);
            final Field keepAliveTimer = KeepAliveCache.class.getDeclaredField("keepAliveTimer");
            keepAliveTimer.setAccessible(true);

            final Thread t = (Thread) keepAliveTimer.get(kac.get(null));
            if(t.getContextClassLoader() == Thread.currentThread().getContextClassLoader()) {
                t.setContextClassLoader(ClassLoader.getSystemClassLoader());
            }
        } catch(final Exception e) {
        }
    }

    public void contextInitialized(ServletContextEvent event) {
    }

}

当然,在 web.xml 中注册监听器:

  <listener>
    <listener-class>org.example.MyServletContextListener</listener-class>
  </listener>

关于tomcat - Tomcat 6 中的 sun.net.www.http.HttpClient 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369222/

相关文章:

java.lang.IllegalArgumentException : Failed to load [netty-tcnative-linux-x86_64, netty-tcnative-linux-x86_64-fedora,netty-tcnative]

java - 使用 apache httpcomponents 进行 Http 身份验证

php - 将 Solr 与 PHP 结合使用

Eclipse 在使用已部署的 WAR 文件启动时自动打开 Web 浏览器

memory-leaks - 通知程序潜在的内存泄漏

c++ - 在没有内存泄漏的情况下将动态分配的数组复制到更大的数组

Java应用肆意消耗内存

java - HttpClient 中的连接重置错误

java - 如何在 Java 中发送带有 XML 数据的 HTTPS POST 请求

tomcat - Nginx 背后的 Tomcat 上的应用程序