Reflection Injector for Optimisation Loosing Previously Defined Classes
by Alessio Soldano
Thanks Darran,
forwarding this here as perhaps we can vote for the bug resolution on
the JAXB project issue tracker.
Alessio
Darran Lofthouse (JIRA) wrote:
> [ https://jira.jboss.org/jira/browse/JBWS-2317?page=com.atlassian.jira.plug... ]
>
> Darran Lofthouse commented on JBWS-2317:
> ----------------------------------------
>
> Modified file submitted to JAXB project : https://jaxb.dev.java.net/issues/show_bug.cgi?id=564
>
>
>> $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-native-3.0.3, jbossws-metro-3.0.3
>> Reporter: Darran Lofthouse
>> Assignee: Darran Lofthouse
>> Fix For: jbossws-native-3.0.5, jbossws-metro-3.0.5
>>
>> Attachments: Injector.java
>>
>>
>> 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.
>>
>
>
--
Alessio Soldano
Web Service Lead
JBoss, a division of Red Hat
16 years, 2 months