[jbossws-dev] Reflection Injector for Optimisation Loosing Previously Defined Classes

Alessio Soldano asoldano at redhat.com
Mon Nov 3 13:00:30 EST 2008


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.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12436665#action_12436665 ] 
>
> 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




More information about the jbossws-dev mailing list