Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-2164

CXFBusImpl never removed from ThreadLocal, generates permgen out of memory error after some redeployments



    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.1.4
    • 2.2.2
    • Bus
    • None


      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
      <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"
      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"

      <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" />

      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");
      ThreadLocal<?> localBus = (ThreadLocal<?>) field.get(null);

      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(); }


      { 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


      Ben Dean
      Software Engineer
      Ontario Systems, LLC


        1. Heap_Walker_Incoming_References.zip
          9 kB
          Francois Masurel
        2. cxf_threadlocal.jpg
          115 kB
          Francois Masurel
        3. threadlocal.patch
          30 kB
          Francois Masurel



            bharathganesh Bharath Ganesh
            mably Francois Masurel
            0 Vote for this issue
            3 Start watching this issue