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