sun.net.www.http.HttpClient内存泄漏在Tomcat 6中

sun.net.www.http.HttpClient内存泄漏在Tomcat 6中,tomcat,memory-leaks,httpclient,Tomcat,Memory Leaks,Httpclient,我正在使用Tomcat 6.0.18。取消部署我的应用程序后,HttpClient似乎持有对WebappClassLoader的引用,因此导致内存泄漏 经过一些调查,我在Tomcat 7.0.6中找到了解决方案,具有keepAliveProtection属性。但是这种方法不适用于Tomcats 6(为了增加对该属性的支持,我定制了JreMemoryLeakPreventionListener) 有人有办法解决Tomcat 6中的漏洞吗? 塔克斯 我找到了解决内存泄漏的方法 必须实施以下措施: p

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

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

有人有办法解决Tomcat 6中的漏洞吗?
塔克斯

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

必须实施以下措施:

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中注册侦听器:


org.example.MyServletContextListener

请将您的解决方案作为答案发布,并将其标记为已接受,否则问题将保持开放状态。
  <listener>
    <listener-class>org.example.MyServletContextListener</listener-class>
  </listener>