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