加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:58:41 所属栏目:Java 来源:网络整理
导读:我正在使用Tomcat 6.0.18.取消部署我的应用程序后,HttpClient似乎持有对WebappClassLoader的引用,从而导致内存泄漏. 经过一番调查,我在Tomcat 7.0.6,JreMemoryLeakPreventionListener中找到了keepAliveProtection属性的解决方案.但是这种方法不适用于Tomcats
我正在使用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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读