[ 
https://issues.apache.org/jira/browse/CXF-2164?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12699725#action_12699725
 ] 

Bharath Ganesh commented on CXF-2164:
-------------------------------------

@Ben Dean

>>But that didn't work. What I eventually ended up doing was to have the 
>>following hack in the
>>shutdown sequence of our webapp:
  >>Field field = org.apache.cxf.BussFactory.class.getDeclaredField("localBus");
  >>field.setAccessible(true);
  >>ThreadLocal<?> localBus = (ThreadLocal<?>) field.get(null);
  >>localBus.remove();

If you have done the above in the shutdown sequence of your web app, I assume 
this code would be executed in the undeployment thread (main thread or some RMI 
thread in case of remote un-deployment) thread of JBoss. The localbus 
threadlocal would not be initialized for this thread. As far as I understand, 
there wont be any effect of doing the localBus.remove() in that thread. So 
there is something else that is fixing your issue.

>>localBus.remove();
Yes, The advantage of using this (added in Java SE 5) would be that the 
complete entry would be removed from the ThreadLocalMap, not just the value. 
But this will not result in a very significant improvement in memory, as the 
value is anyways GC'ed even when you do cxfBus.shutdown().

@Francois
>>In fact the thread local variables should be set and removed for each request 
>>in a try/finally block (like db connections). It doesn't seem to be the case.
Yes, I am looking at those places and seeing what can be done, to make sure we 
don't keep anything in the web-worker thread beyond the scope of the request .

> CXFBusImpl never removed from ThreadLocal, generates permgen out of memory 
> error after some redeployments
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: CXF-2164
>                 URL: https://issues.apache.org/jira/browse/CXF-2164
>             Project: CXF
>          Issue Type: Bug
>          Components: Bus
>    Affects Versions: 2.1.4
>            Reporter: Francois Masurel
>            Assignee: Bharath Ganesh
>
> I've found this message on a mailing list recently, and it doesn't seem to 
> have been resolved as we have the same problem with version 2.1.4 of CXF on 
> one of our webapp :
> Hello CXF users,
> I've been  working on figuring out why our JBoss servers keep going down with 
> permgen out
> of memory exceptions when we redeploy our war files. To do this I had been 
> using a profiler
> to inspect the WebAppClassloader to find out what was keeping it from being 
> garbage collected.
> One such culprit was the class org.apache.cxf.BusFactory
> The BusFactory has a ThreadLocal in which it stores a copy of CXFBusImpl. 
> However, this isn't
> getting cleaned up properly when the war is undeployed. I noticed that 
> CXFBusImpl has a shutdown
> method that calls BusFactory.setDefaultBus(null) which in turn sets the value 
> stored in the
> ThreadLocal to null. However, this doesn't seem to be getting called.
> The way we are using CXF from spring is with the following 
> WEB-INF/services.xml file in our
> war:
>   <beans xmlns="http://www.springframework.org/schema/beans"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>     xmlns:amq="http://activemq.org/config/1.0"; 
> xmlns:jaxws="http://cxf.apache.org/jaxws";
>     xmlns:http-conf="http://cxf.apache.org/transports/http/configuration";
>     xsi:schemaLocation="
>       http://www.springframework.org/schema/beans 
> http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
>       http://cxf.apache.org/transports/http/configuration 
> http://cxf.apache.org/schemas/configuration/http-conf.xsd
>       http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
>       http://activemq.org/config/1.0 
> http://activemq.apache.org/schema/core/activemq-core-5.0.0.xsd";
>     default-autowire="byType">
>     <import resource="classpath:META-INF/cxf/cxf.xml" />
>     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
>     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
>     <jaxws:endpoint id="helloService" implementor="#helloSvc" 
> address="/HelloService" />
>   </beans>
> I'm not really sure why this Bus.shutdown() isn't getting called or even who 
> is responsible
> for calling it. I tried doing something along the lines of:
>   WebApplicationContext webContext = 
> WebApplicationContextUtils.getRequiredWebApplicationContext(context);
>   if (webContext.containsBean("cxf")) {
>     CXFBusImpl cxfBus = (CXFBusImpl) webContext.getBean("cxf");
>     cxfBus.shutdown(true);
>   }
> But that didn't work. What I eventually ended up doing was to have the 
> following hack in the
> shutdown sequence of our webapp:
>   Field field = org.apache.cxf.BussFactory.class.getDeclaredField("localBus");
>   field.setAccessible(true);
>   ThreadLocal<?> localBus = (ThreadLocal<?>) field.get(null);
>   localBus.remove();
> This did work but obviously it is a bit of an ugly hack. Is there something 
> that needs to
> be included in our service.xml file to tell spring how to cleanup CXF? Is 
> this maybe a bug
> in CXF that the CXFBusImpl.shutdown(Boolean) just isn't getting called at all 
> or maybe that
> in BusFactory.setThreadDefaultBus(Bus) that there should be some check such 
> as:
>   if (bus == null) {
>     localBus.remove();
>   } else {
>     localBus.set(bus);
>   }
> Or maybe some combination of all of these. I'm reasonably new to CXF, Spring, 
> and all this
> stuff so I apologize ahead of time if there is some obvious solution that I 
> just didn't come
> across but I've been trying to scour the CXF and Spring documentation for 
> some idea of the
> correct way to do this and why BusFactory is keeping its ThreadLocal but I 
> can't figure it
> out.
> Thanks!
> Ben Dean
> Software Engineer
> Ontario Systems, LLC

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to