On 05/03/2010 12:48 PM, Pid wrote:
> On 03/05/2010 17:15, Mark Shifman wrote:
>> I have a web app running under tomcat-6.0.26 with 
>> JreMemoryLeakPreventionListener, java jdk1.6.0_18.
>>
>> Using jmap -histo pid, I can watch 
>> com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl, etc increase in number
>> after running my unmarshal action, followed by undeploy and redeploy.  Find 
>> Leaks in the manager also finds leaks.
> 
> After a few undeploy/redeploy cycles does the number of
> WebappClassLoader's also increase?

Yes it increases 1 for each undeploy/redeploy cycle.
> 
>> The JAXBContext instance is created with a singleton that is an enum (using 
>> Josh Block's pattern):
>>
>> public enum JAXBContextMascot {
>>      INSTANCE("com.matrixscience.xmlns.schema.mascot_search_results_2" );
>>      private JAXBContext ctx;
>>      JAXBContextMascot(String contextPath) {
>>              try {
>>                      ctx =JAXBContext.newInstance(clazz);
> 
> Where does the 'clazz' variable come from?

My bad I edited the email argg.  should of course be contextPath.
> 
>>              } catch (JAXBException e) {
>>                      throw new RuntimeException(e);
>>              }
>>      }
>>      public Unmarshaller createUnmarshaller(){
>>              try {
>>                      return ctx.createUnmarshaller();
>>              } catch (JAXBException e) {
>>                      throw new RuntimeException(e);
>>              }
>>      }
>> }
>>
>> Am I doing something wrong which is causing the memory leak?
> 
> Maybe.
> 
>> JAXBContext.newInstance() can take a ClassLoader argument.  Is there some 
>> ClassLoader I should be using that will get around this?
> 
> Where is the jar with the above code, in a webapp?
The code above in in the war for the web app in a class in 
WEB-INF/classes/org/blablabla

It is called via a class that looks like this:

public class JAXBMascot {
        protected static Log log = LogFactory.getLog(JAXBMascot.class);
        private XMLEventReader reader;
        private Unmarshaller u = 
JAXBContextMascot.INSTANCE.createUnmarshaller();
        private InputStream jxb_in;

        public static JAXBMascot getInstance(InputStream in) {
                JAXBMascot m = new JAXBMascot();
                try {
                        m.setJxb_in(in);
                        
m.setReader(XMLInputFactory.newInstance().createXMLEventReader(in));
                } catch (Exception e) {
                        log.fatal("error getting JAXBMascot instance");
                        IOUtils.closeQuietly(in);
                        throw new RuntimeException(e);
                }

                return m;
        }
....
}

This is also in the webapp in WEB-INF/classes/org/blablabla
thanks
mas
> 
> 
> p
> 
>> Any help would be appreciated.
>> mas
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
>> For additional commands, e-mail: users-h...@tomcat.apache.org
>>
> 
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to