gpt4 book ai didi

tomcat - Tomcat 6 中的 sun.net.www.http.HttpClient 内存泄漏

转载 作者:行者123 更新时间:2023-11-28 21:47:05 24 4
gpt4 key购买 nike

我正在使用 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>

关于tomcat - Tomcat 6 中的 sun.net.www.http.HttpClient 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com