[jboss-user] [JBossWS] - Memory leak with Provider<Source> webservice implementation

Sintetik7 do-not-reply at jboss.com
Thu May 21 06:13:24 EDT 2009


Hi,

I have a problem running my app that implements webservice using Provider api. After ~4hrs of mild load AS goes out of memory.

I'm using JBoss 5.0.1 with sun jdk 1.6.0_14. Configuration is
-Xms256m -Xmx1024m -XX:MaxPermSize=256m -Dorg.jboss.resolver.warning=true -XX:+UseConcMarkSweepGC -Dsun.rmi.dgc.client.gcInterval=1800000 -Dsun.rmi.dgc.server.gcInterval=1800000

My endpoints defined as follows:


  | @WebServiceProvider(serviceName = "StorageService", portName = "External", wsdlLocation = "WEB-INF/wsdl/storage.wsdl")
  | @BindingType(value = HTTPBinding.HTTP_BINDING)
  | @ServiceMode(value = Service.Mode.PAYLOAD)
  | public class StorageServiceExternalProvider extends AbstractServiceProvider implements Provider<Source> {
  | 	
  | 	@Resource(type = Object.class)
  | 	protected WebServiceContext wsContext;
  | 
  | 	public Source invoke(Source req) {
  | 		MessageContext mc = wsContext.getMessageContext();
  | 		String path = ((String) mc.get(MessageContext.PATH_INFO)).substring(1);
  | 		return invoke(path, req);
  | 	}
  | 
  | 	protected String getJndiNameSLSB() {
  | 		return "StorageExternalSarco/local";
  | 	}
  | }
  | 
  | 


  | public abstract class AbstractServiceProvider {
  | private static Logger log = Logger.getLogger(AbstractServiceProvider.class);
  | 	
  | 	protected abstract String getJndiNameSLSB();
  | 	
  | 	public Source invoke(String path, Source req) {
  | 		
  | 		JAXBContext jc = null;
  | 		Object local;
  | 		Method[] localMethods;
  | 		
  | 		try {
  | 			InitialContext ic = new InitialContext();
  | 			local = ic.lookup(getJndiNameSLSB());
  | 			ic.close();
  | 			localMethods = local.getClass().getMethods();
  | 
  | 			jc = StorageJAXBContext.getContext();
  | 
  | 		} catch (Throwable t) {
  | 			log.error("Unable to initialize", t);
  | 			return new DOMSource();
  | 		}
  | 		
  | 		Reader decoded;
  | 		Object in = null;
  | 		try {
  | 
  | 			decoded = new StringReader(URLDecoder.decode(req.toString(), "utf8"));
  | 			in = jc.createUnmarshaller().unmarshal(decoded);
  | 			
  | 			if (in instanceof JAXBElement<?>)
  | 				in = ((JAXBElement<?>)in).getValue();
  | 			
  | 			for (Method m : localMethods)
  | 				if (m.getName().equals(path))
  | 				{
  | 					Object result = m.invoke(local, in);
  | 					Class<?> retType = m.getReturnType();
  | 					if (retType == Void.TYPE)
  | 						return new DOMSource();
  | 					else
  | 						return new JAXBSource(jc, result);
  | 				}
  | 
  | 			throw new Exception("Accessing invalid path: " + path);
  | 
  | 		} catch (Throwable e) {
  | 			log.error("Error processing invocation for path: " + path + ", input type is: " + (in == null ? "NULL" : in.getClass()), e);
  | 			return new DOMSource();
  | 		}		
  | 	}
  | 

web.xml:

  <servlet>
  |     <servlet-name>StorageServiceExternalProvider</servlet-name>
  |     <servlet-class>com.photoholding.storage.StorageServiceExternalProvider</servlet-class>
  |   </servlet>
  |   <servlet-mapping>
  |     <servlet-name>StorageServiceExternalProvider</servlet-name>
  |     <url-pattern>/External/*</url-pattern>
  |   </servlet-mapping>


I tried to do jmap profiling and it shows lots of B[ and C[ objects growing with time. Looks like "Provider" instance is never released and GC skips it - size of the OldGen grows until GC can't handle it.

Any help is appreciated.


View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4232449#4232449

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4232449



More information about the jboss-user mailing list