[ https://issues.apache.org/jira/browse/CXF-7591?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Dennis Kieselhorst resolved CXF-7591. ------------------------------------- Resolution: Fixed I'm resolving this as Daniel's patch went into the latest releases. Please retest and reopen this issue if the problem still exists. > memory leak in ClientImpl > ------------------------- > > Key: CXF-7591 > URL: https://issues.apache.org/jira/browse/CXF-7591 > Project: CXF > Issue Type: Bug > Components: Core, JAX-WS Runtime > Affects Versions: 3.1.6 > Environment: wildfly-10.1.0 > Reporter: Luca Boncompagni > Priority: Major > Fix For: 3.1.15, 3.2.2 > > Attachments: CXF_7591-patch.txt > > > My app is a web-app and my wildfly has ~ 300 thread. If I understand > correctly the code, ClientImpl.responseContext is cleaned only on destroy. We > use a lot of service ad some of them have a large output (~10Mb). So, I need > a lot of memory for storing ClientImpl.responseContext. > I try the following patch ant it seems to solve the problem, but it has an > horrible cast. > {{ > diff --git a/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java > b/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java > index 428f79454b..b15fb4dff2 100644 > --- a/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java > +++ b/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java > @@ -29,7 +29,7 @@ import java.util.Collections; > import java.util.HashMap; > import java.util.List; > import java.util.Map; > -import java.util.WeakHashMap; > +import java.util.HashMap; > import java.util.concurrent.ConcurrentHashMap; > import java.util.concurrent.Executor; > import java.util.logging.Level; > @@ -96,10 +96,10 @@ public class ClientImpl > > protected Map<String, Object> currentRequestContext = new > ConcurrentHashMap<String, Object>(8, 0.75f, 4); > protected Map<Thread, EchoContext> requestContext > - = Collections.synchronizedMap(new WeakHashMap<Thread, > EchoContext>()); > + = Collections.synchronizedMap(new HashMap<Thread, EchoContext>()); > > protected Map<Thread, Map<String, Object>> responseContext > - = Collections.synchronizedMap(new WeakHashMap<Thread, Map<String, > Object>>()); > + = Collections.synchronizedMap(new HashMap<Thread, Map<String, > Object>>()); > > protected Executor executor; > > @@ -1052,5 +1052,8 @@ public class ClientImpl > } > } > > - > + public void releaseLocalThread() { > + requestContext.remove(Thread.currentThread()); > + responseContext.remove(Thread.currentThread()); > + } > } > diff --git > a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java > b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java > index d963693afd..37b5e2ed02 100644 > --- > a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java > +++ > b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java > @@ -131,6 +131,7 @@ public class JaxWsClientProxy extends > org.apache.cxf.frontend.ClientProxy implem > client.getRequestContext().put(Method.class.getName(), method); > boolean isAsync = isAsync(method); > > + try { > Object result = null; > try { > if (isAsync) { > @@ -184,6 +185,9 @@ public class JaxWsClientProxy extends > org.apache.cxf.frontend.ClientProxy implem > } > } > return adjustObject(result); > + } finally { > + if(client instanceof org.apache.cxf.endpoint.ClientImpl) > ((org.apache.cxf.endpoint.ClientImpl)client).releaseLocalThread(); > + } > } > boolean isAsync(Method m) { > return m.getName().endsWith("Async") > }} > Luca -- This message was sent by Atlassian JIRA (v7.6.3#76005)