Uploaded image for project: 'JBoss Web Services'
  1. JBoss Web Services
  2. JBWS-2317

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

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • None
    • jbossws-native-3.0.3, jbossws-metro-3.0.3
    • None
    • Workaround Exists
    • Hide

      This behaviour can be switched off with the following option: -

      -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.java.noOptimize=true

      However this completely disables the intended optimisation and reflection will be used.

      Show
      This behaviour can be switched off with the following option: - -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.java.noOptimize=true However this completely disables the intended optimisation and reflection will be used.

      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.

              rhn-support-asoldano Alessio Soldano
              darran.lofthouse@redhat.com Darran Lofthouse
              Votes:
              1 Vote for this issue
              Watchers:
              2 Start watching this issue

                Created:
                Updated:
                Resolved: