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.
>