Я нашел решение для утечки памяти.
Необходимо сделать реализацию 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>