Hi,

i know this thread is a bit old but discovered the option (system property)
com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true

it seems it prevent bytecode update to create injector (jaxb)

anyone tested?

*Romain Manni-Bucau*
*Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
*LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
*Github: https://github.com/rmannibucau*




2012/2/29 Romain Manni-Bucau <rmannibu...@gmail.com>

> yep
>
> - Romain
>
>
>
> 2012/2/29 David Blevins <david.blev...@gmail.com>
>
>> I think we're agreeing.  We require 966 Accessor implementations and 1
>> AccessorFactory to return them.
>>
>> At this point we're only one AccessorFactory implementation away from
>> leveraging those 966 already generated Accessor implementations.
>>
>> That sound about right?
>>
>>
>> -David
>>
>> On Feb 28, 2012, at 11:50 PM, Romain Manni-Bucau wrote:
>>
>> > more info: if you specified custom accessor factory as i said in "memory
>> > tweaking" thread you can get rid of the default implementations:
>> >
>> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/com/sun/xml/internal/bind/v2/runtime/reflect/Accessor.java#Accessor.FieldReflection
>> > for
>> > instance
>> >
>> > no call to OptimizedAccessorFactory -> no injection :)
>> >
>> > it can be something like:
>> >
>> > @XmlAccessorFactory(EjbJar.AccessorFactoryImpl.class)
>> > public class EjbJar implements NamedModule {
>> > public static final class AccessorFactoryImpl implements
>> AccessorFactory {
>> >    public AccessorFactoryImpl() {
>> >        System.out.println();
>> >    }
>> >
>> >    @Override
>> >    public Accessor createFieldAccessor(Class aClass, Field field,
>> boolean
>> > b) throws JAXBException {
>> >        return new EjbJarField(field);
>> >    }
>> >
>> >    @Override
>> >    public Accessor createPropertyAccessor(Class aClass,
>> > java.lang.reflect.Method method, java.lang.reflect.Method method1)
>> throws
>> > JAXBException {
>> >        return new EjbJarGetterSetter(method, method1);
>> >    }
>> > ...
>> > }
>> >
>> > and then we simply start the context adding a RI property:
>> >
>> > JAXBContextFactory.newInstance(new Class<?>[] { EjbJar.class }, new
>> > HashMap<String, Object>() {{
>> >            put(JAXBRIContext.XMLACCESSORFACTORY_SUPPORT, true);
>> >        }});
>> >
>> > - Romain
>> >
>> >
>> > 2012/2/29 Romain Manni-Bucau <rmannibu...@gmail.com>
>> >
>> >> I spoke about using getter/setter from our own accessorfactory so we
>> can
>> >> prevent generation and use our well known getter/setter.
>> >>
>> >> Le 29 févr. 2012 03:44, "David Blevins" <david.blev...@gmail.com> a
>> >> écrit :
>> >>
>> >>
>> >>> On Feb 27, 2012, at 10:02 PM, Romain Manni-Bucau wrote:
>> >>>
>> >>>> Was my analysis so the question is do we still need to capture them
>> >>> like it
>> >>>> or can we use more simple setters/getters?
>> >>>
>> >>> The accessors are generated regardless if field or getters/setters are
>> >>> used.
>> >>>
>> >>>> Note: the code i pasted in my previous email is the one which is
>> >>> generated
>> >>>> from the injector.
>> >>>
>> >>> You might have to give me a line number as I don't see that in the
>> >>> NativeMethodAccessorImpl.java you posted in your previous email.
>> >>>
>> >>>> Ps: maybe i looked too fast but i didnt see jaxb-impl in tomee
>> >>>
>> >>> It's part of the jvm as of Java 6, so it's no longer something we
>> ship.
>> >>>
>> >>> That said, if we wanted to certify our JAX-WS stack, we'd have to
>> upgrade
>> >>> to 2.2 which means putting the jaxb impl in an endorsed dir (same as
>> >>> @Resource.lookup)
>> >>>
>> >>> -David
>> >>>
>> >>>> Le 28 févr. 2012 06:36, "David Blevins" <david.blev...@gmail.com> a
>> >>> écrit :
>> >>>>
>> >>>>>
>> >>>>> On Feb 26, 2012, at 11:59 PM, Romain Manni-Bucau wrote:
>> >>>>>
>> >>>>>> did you look
>> >>>>>>
>> >>>>>
>> >>>
>> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/reflect/NativeMethodAccessorImpl.java
>> >>>>>> ?
>> >>>>>>
>> >>>>>> seems this class usage/generation is not a simple try {
>> loadClass() }
>> >>>>> catch
>> >>>>>> (...)  { generate(); }
>> >>>>>>
>> >>>>>> it is generated if it is often used (> 15 times by default if i
>> didnt
>> >>>>> look
>> >>>>>> too quickly).
>> >>>>>
>> >>>>> That's a deceptively similar, but unrelated bit of code.  Those are
>> for
>> >>>>> the java.lang.reflect API.
>> >>>>>
>> >>>>> I grabbed the JAXB RI source and dug around (svn co
>> >>>>> https://svn.java.net/svn/jaxb~version2/tags/jaxb-2_1_9).  This
>> >>> appears to
>> >>>>> be the mechanism it uses to determine if the class has already been
>> >>>>> generated:
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>
>> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/com/sun/xml/internal/bind/v2/runtime/reflect/opt/Injector.java?av=f#112
>> >>>>>
>> >>>>> Basically a weak hashmap of classloaders and "Injector" instances
>> where
>> >>>>> each "Injector" holds a hashmap of classes that have been generated.
>> >>>>>
>> >>>>> Not sure how we get around it other than an AccessorFactory.
>> >>>>>
>> >>>>>> Custom accessors is probably the key.
>> >>>>>
>> >>>>> Perhaps one that just instantiates the generated Accessors we've
>> >>> captured.
>> >>>>>
>> >>>>>
>> >>>>> -David
>> >>>>>
>> >>>>>>
>> >>>>>> 2012/2/27 David Blevins <david.blev...@gmail.com>
>> >>>>>>
>> >>>>>>>
>> >>>>>>> On Sep 26, 2011, at 12:43 AM, David Blevins wrote:
>> >>>>>>>
>> >>>>>>>> # JAXB Accessors
>> >>>>>>>>
>> >>>>>>>> One of the biggest polluters of the class space is JAXB as it
>> >>> generates
>> >>>>>>> accessors for all the fields.  First thought is, gee, I wonder if
>> we
>> >>>>> can do
>> >>>>>>> that at build time and keep the class definitions.  If there's
>> some
>> >>> way
>> >>>>> we
>> >>>>>>> could write down those classes, it could save us a lot of trouble
>> at
>> >>>>>>> runtime.  We'd get a great speed boost on the cold start -- which
>> is
>> >>>>> where
>> >>>>>>> unit test performance lives.
>> >>>>>>>>
>> >>>>>>>> A while back I did some perf testing of our OpenEJB 3.0 speed and
>> >>> JAXB
>> >>>>>>> was nearly half of the time it took to boot.  We have a bigger
>> JAXB
>> >>> tree
>> >>>>>>> than we did and that can easily account for a sliver of the
>> slightly
>> >>>>> slower
>> >>>>>>> embedded speed.
>> >>>>>>>>
>> >>>>>>>> The classes exist, so there has to be some way to write them to
>> disk
>> >>>>>>> even if there is no magical flag that will make the JAXB RI do it
>> for
>> >>>>> us.
>> >>>>>>> Would be great to know if such a flag did exist.  If someone is
>> >>> looking
>> >>>>>>> for a research problem, this would be a great one.
>> >>>>>>>
>> >>>>>>> Did some work on this.
>> >>> https://issues.apache.org/jira/browse/TOMEE-143
>> >>>>>>>
>> >>>>>>> With a JavaAgent, we monitor all classes created and their
>> bytecode.
>> >>>>>>> Anything that is a "$JaxbAccessor" class is written to disk.  The
>> new
>> >>>>>>> openejb-jee-accessors module contains all these accessors.
>> >>>>>>>
>> >>>>>>> $ ls -lh target/openejb-jee-accessors-4.0.0-beta-3-SNAPSHOT.jar
>> >>>>>>> -rw-r--r--  1 dblevins  dblevins   596K Feb 26 15:48
>> >>>>>>> target/openejb-jee-accessors-4.0.0-beta-3-SNAPSHOT.jar
>> >>>>>>>
>> >>>>>>> $ jar tvf target/openejb-jee-accessors-4.0.0-beta-3-SNAPSHOT.jar |
>> >>>>> grep
>> >>>>>>> 'WebApp'
>> >>>>>>>    666 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_absoluteOrdering.class
>> >>>>>>>    608 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_contextParam.class
>> >>>>>>>    652 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_dataSource.class
>> >>>>>>>    610 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_distributable.class
>> >>>>>>>    654 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_ejbLocalRef.class
>> >>>>>>>    644 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_ejbRef.class
>> >>>>>>>    648 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_envEntry.class
>> >>>>>>>    602 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_errorPage.class
>> >>>>>>>    596 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_filter.class
>> >>>>>>>    610 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_filterMapping.class
>> >>>>>>>    640 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_icon.class
>> >>>>>>>    602 Sun Feb 26 15:48:22 PST 2012
>> >>>>>>> org/apache/openejb/jee/WebApp$JaxbAccessorF_jspConfig.class
>> >>>>>>>    [....]
>> >>>>>>>
>> >>>>>>> $ jar tvf target/openejb-jee-accessors-4.0.0-beta-3-SNAPSHOT.jar |
>> >>>>> grep
>> >>>>>>> -c 'class$'
>> >>>>>>> 966
>> >>>>>>>
>> >>>>>>> Soo... all that and it doesn't seem to work :)
>> >>>>>>>
>> >>>>>>> mingus:~/openejb/examples 04:13:17
>> >>>>>>> $ for n in simple-stateless* ; do  (cd $n && mvn clean install);
>> >>> done
>> >>>>> |
>> >>>>>>> egrep 'Time elapsed|JAXBContext'
>> >>>>>>> Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed:
>> >>> 0.918
>> >>>>>>> sec
>> >>>>>>> JAXBContext.newInstance 403  org.apache.openejb.jee.EjbJar
>> >>>>>>> Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed:
>> >>> 1.341
>> >>>>>>> sec
>> >>>>>>>
>> >>>>>>> I think we're darn close though.
>> >>>>>>>
>> >>>>>>> I'd like to shift gears and work on more classpath scanning
>> >>> performance
>> >>>>>>> boosts, if someone wants to pickup this task and see what we might
>> >>> have
>> >>>>> to
>> >>>>>>> do to get JAXB to see the classes we've generated, that'd be
>> great.
>> >>>>>>>
>> >>>>>>> Could shave half a second or a second off of even a simple test.
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> -David
>> >>>>>>>
>> >>>>>>>
>> >>>>>
>> >>>>>
>> >>>
>> >>>
>>
>>
>

Reply via email to