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

前端之家收集整理的这篇文章主要介绍了sun.net.www.http.HttpClient在Tomcat 6中发生内存泄漏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Tomcat 6.0.18.取消部署我的应用程序后,HttpClient似乎持有对WebappClassLoader的引用,从而导致内存泄漏.

经过一番调查,我在Tomcat 7.0.6,JreMemoryLeakPreventionListener中找到了keepAliveProtection属性解决方案.但是这种方法不适用于Tomcats 6(我已经定制了JreMemoryLeakPreventionListener,以便添加对此属性支持).

有没有人有解决方案如何在Tomcat 6中修复这个漏洞?
感谢名单!

解决方法

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

必须执行ServletContextListener,如下所示:

  1. package org.example;
  2.  
  3. public class MyServletContextListener implements ServletContextListener {
  4.  
  5. public void contextDestroyed(ServletContextEvent sce) {
  6. tomcatLeakPreventionForHttpClient();
  7. }
  8.  
  9. private void tomcatLeakPreventionForHttpClient() {
  10. try {
  11. final Field kac = HttpClient.class.getDeclaredField("kac");
  12. kac.setAccessible(true);
  13. final Field keepAliveTimer = KeepAliveCache.class.getDeclaredField("keepAliveTimer");
  14. keepAliveTimer.setAccessible(true);
  15.  
  16. final Thread t = (Thread) keepAliveTimer.get(kac.get(null));
  17. if(t.getContextClassLoader() == Thread.currentThread().getContextClassLoader()) {
  18. t.setContextClassLoader(ClassLoader.getSystemClassLoader());
  19. }
  20. } catch(final Exception e) {
  21. }
  22. }
  23.  
  24. public void contextInitialized(ServletContextEvent event) {
  25. }
  26.  
  27. }

当然,要在web.xml中注册监听器:

  1. <listener>
  2. <listener-class>org.example.MyServletContextListener</listener-class>
  3. </listener>

猜你在找的Java相关文章