sun.net.www.http.HttpClient утечка памяти в Tomcat 6 - PullRequest
6 голосов
/ 16 июня 2011

Я использую Tomcat 6.0.18 .После удаления моего приложения HttpClient , кажется, содержит ссылку на WebappClassLoader , что приводит к утечке памяти.

После некоторого расследования я нашел решение в Tomcat 7.0.6 , JreMemoryLeakPreventionListener с атрибутом keepAliveProtection .Но этот подход не работает с Tomcats 6 (я настроил JreMemoryLeakPreventionListener, чтобы добавить поддержку этого атрибута).

У кого-нибудь есть решение, как исправить эту утечку в Tomcat 6?Thanx!

1 Ответ

8 голосов
/ 24 июня 2011

Я нашел решение для утечки памяти.

Необходимо сделать реализацию 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...