You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Daniel Kulp (JIRA)" <ji...@apache.org> on 2009/04/13 23:34:15 UTC
[jira] Commented: (CXF-2164) CXFBusImpl never removed from
ThreadLocal, generates permgen out of memory error after some redeployments
[ https://issues.apache.org/jira/browse/CXF-2164?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12698559#action_12698559 ]
Daniel Kulp commented on CXF-2164:
----------------------------------
The CXF servlet definitely has a destroy method that calls shutdown:
public void destroy() {
String s = bus.getId();
BUS_MAP.remove(s);
bus.shutdown(true);
}
Thus, it LOOKS like the JBoss server isn't calling destroy on the the redeploy if destroy isn't being called. If you can show that is the case, I would definitely log a bug with them.
> 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
>
> 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.