2011-06-16 45 views
6

Kullanıyorum Tomcat 6.0.18. Uygulamamın bağlantısından sonra, HttpClient, WebappClassLoader'a bir başvuru yapıyor gibi görünüyor, dolayısıyla bellek sızıntısına neden oluyor. sun.net.www.http.HttpCatent bellek sızıntısı Tomcat 6

Biraz araştırma yaptığımızda, ben keepAliveProtection ile Tomcat 7.0.6, JreMemoryLeakPreventionListener çözümü buldum niteliğini. Ancak bu yaklaşım, Tomcats 6 ile çalışmaz (bu özelliğe destek eklemek için JreMemoryLeakPreventionListener'ı özelleştirdim).

Tomcat 6'da bu sızıntının nasıl giderileceği konusunda bir çözümü olan var mı? Thanx!

+0

bir cevap olarak çözüm sonrası edin: Web.xml dinleyiciyi kayıt, tabii ki,

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) { } } 

ve:

biri aşağıdaki gibi ServletContextListener uygulanmasını yapmalısınız ve kabul edildi olarak işaretleyin, aksi halde soru açık kalacaktır. – skaffman

+0

@skaffman Bitti! – Igor

cevap

8

Bellek sızıntısı için çözüm buldum. ,

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