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