cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Francois Masurel (JIRA)" <>
Subject [jira] Updated: (CXF-2164) CXFBusImpl never removed from ThreadLocal, generates permgen out of memory error after some redeployments
Date Wed, 22 Apr 2009 07:26:47 GMT


Francois Masurel updated CXF-2164:


Hi Daniel,

I've put back the original (non modified) jars of CXF 2.1.4 and did a few redeploys on our
Spring-CXF web app.  Threadlocal issues are back.

Attachments contains what I get from JProfiler (latest version 5.2.1).

Configuration : Tomcat 6.0.18, Sun JDK 1.5.0_17-b04, Windows XP, Spring 2.0.8

> CXFBusImpl never removed from ThreadLocal, generates permgen out of memory error after
some redeployments
> ---------------------------------------------------------------------------------------------------------
>                 Key: CXF-2164
>                 URL:
>             Project: CXF
>          Issue Type: Bug
>          Components: Bus
>    Affects Versions: 2.1.4
>            Reporter: Francois Masurel
>            Assignee: Bharath Ganesh
>         Attachments: cxf_threadlocal.jpg,, threadlocal.patch
> 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
> 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
> 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="" xmlns:xsi=""
>     xmlns:amq="" xmlns:jaxws=""
>     xmlns:http-conf=""
>     xsi:schemaLocation="
>     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
> 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
> 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
> stuff so I apologize ahead of time if there is some obvious solution that I just didn't
> across but I've been trying to scour the CXF and Spring documentation for some idea of
> correct way to do this and why BusFactory is keeping its ThreadLocal but I can't figure
> 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.

View raw message