[jbossws-issues] [JBoss JIRA] Created: (JBWS-2317) $JAXBAccessorF_ and $JAXBAccessorM_ cache loosing classes and failing to re-create classes.

Darran Lofthouse (JIRA) jira-events at lists.jboss.org
Mon Sep 22 10:29:24 EDT 2008


$JAXBAccessorF_ and $JAXBAccessorM_ cache loosing classes and failing to re-create classes.
-------------------------------------------------------------------------------------------

                 Key: JBWS-2317
                 URL: https://jira.jboss.org/jira/browse/JBWS-2317
             Project: JBoss Web Services
          Issue Type: Bug
      Security Level: Public (Everyone can see)
          Components: jbossws-metro, jbossws-native
    Affects Versions:  jbossws-metro-3.0.3,  jbossws-native-3.0.3
            Reporter: Darran Lofthouse
            Assignee: Darran Lofthouse
             Fix For: jbossws-native-3.0.4, jbossws-metro-3.0.4


The JAXB implementation contains a package of classes to optimise field and method access by dynamically generating classes to avoid reflection, this has a start-up performance hit but then leads to an optimised runtime.

The package is: -

  'com.sun.xml.bind.v2.runtime.reflect.opt'

Within the Injector class is a HashMap to maintain a cache of these classes against the classloader they were created for: -

private static final Map<ClassLoader,WeakReference<Injector>> injectors =
       Collections.synchronizedMap(new WeakHashMap<ClassLoader,WeakReference<Injector>>());

A WeakReference has been used to wrap the value to prevent the value retaining a reference to the ClassLoader and then preventing garbage collection and leading to a leak.

The problem is that nothing retains a reference to the Injector so as this is wrapped with a WeakReference it is garbage collected.

I will attach to this case a new version of Injector.java.

The fix switches to using a Strong reference to the Injector so it is not garbage collected.

To maintain the original requirements the Injector will no longer hold a reference to the ClassLoader and will instead make use of the one passed in.  

Within the Injector the HashMap of classes will reference the Class with a WeakReference.  If we get a WeakReference with no class it means the class was previously loaded but garbage collected, in this case try to load the class by name from the classloader - if this fails then redefine the class.




-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jbossws-issues mailing list