User development,

A new message was posted in the thread "ClassPool Refactoring":

http://community.jboss.org/message/527258#527258

Author  : Flavia Rainone
Profile : http://community.jboss.org/people/flavia.rain...@jboss.com

Message:
--------------------------------------------------------------
> mailto:flavia.rain...@jboss.com wrote:
>  
> All tests are passing now in my system, which allowed me to validate two 
> previous fixes Kabir and I implemented for the problem of duplicate CtClasses.
> Kabir's fix consists of https://jira.jboss.org/jira/browse/JBAOP-766 :
>  
> *public* *class* DelegatingClassPool *extends* BaseClassPool
> {
> ...
>  *public* CtClass getCached(String classname)
>    {
> >>>      //TODO Not 100 sure this is correct, but it seems to do the job 
> >>>where repeated calls to get() on a pool in a hierarchy returns a different 
> >>>instance of the class
> >>>      CtClass clazz = super.getCachedLocally(classname);
> >>>      *if* (clazz != *null*)
> >>>         *return* clazz;  
>       
>       *if* (isGeneratedClass(classname))
>       {
>          *return* *null*;
>       }
>       *return* domain.getCachedOrCreate(this, classname, *false*);
>    }
> }
> 
> 
>  
> 
>  
> 
> My fix has never been comitted and consists of adding a check on the classes 
> cache to BaseClassPool.get:
> 
>  
> 
> *public* *class* BaseClassPool *extends* AbstractClassPool
> {
>  ...
>  @Override
>    *public* *final* CtClass get(String classname) *throws* NotFoundException 
>    {
>       *boolean* trace = logger.isTraceEnabled();
>       *if* (trace) logger.trace(*this* + " initiating get of " + classname);
>  
>       *if* (this.getClassLoader() == *null*)
>       {
>          *throw* *new* IllegalStateException("Illegal call. " + " A class 
> cannot be retrieved from ClassPool " +
>                                          *this* + " because the corresponding 
> ClassLoader is garbage collected");
>       }
>       *try*
>       {
> >>>         *if* (this.classes.containsKey(classname))
> >>>         {
> >>>            *return* (CtClass) classes.get(classname); 
> >>>         }
>          CtClass clazz = super.get(classname);
>          *if* (trace)
>             logger.trace(*this* + " completed get of " + classname + " " + 
> getClassPoolLogStringForClass(clazz));
>  
>          *return* clazz;
>       }
>       *catch* (NotFoundException e)
>       {
>          *if* (trace)
>             logger.trace(classname + " could not be found from " + this, e);
>          *throw* e;
>       }
>    }
> }
> 
> 
>  
> 
> 
> It turns out that, once all tests were fixed for issue 
> https://jira.jboss.org/jira/browse/JBREFLECT-94, those fixes weren't needed 
> anymore, which means that JBREFLECT-94 was the real issue.
> 
>  
> 
> Now I'm left with the dillema of whether should I commit those fixes. I have 
> started running some tests to try to figure out if any of those bring some 
> improvement, and it seems that looking up classes cache in 
> BaseClassLoader.get does bring a few improvements to the performance of aop 
> tests, but I need to run those tests more times in order to do a reasonable 
> investigation.
> 
>  
> 
> While working with Kabir to fix the AOP tests for AS, he pointed out that 
> there could be an issue related to my fix. It seemed obviously right to me to 
> look in the classes cache (a cache declared in ScopedClassPool that contains 
> all classes created by the current class pool) before doing anything else. To 
> me, if we have a hit in the cache, it means that the current pool is the one 
> that is supposed to load the class, and that there is no need to look further 
> by calling super.get method. But Kabir raised the following possibility. What 
> if the class pool scenario (a reflection of the class loader/domain scenario) 
> changes after the current class pool loaded the class, in a way that this 
> class pool is no longer the one responsible for loading that class? In that 
> case, looking for the class in the classes cache would be a serious mistake. 
> Is this scenario possible?
> 
>  Regarding Kabir's fix, I'm also looking for any opnion regarding whether it 
> should be committed. It seems, though, that adding both fixes brings some 
> small performance penalty. I'll continue running tests to be able to assert 
> whether this is really true, and what is the penalty we're talking about.
I ran the performance tests, and concluded that there is not performance 
penalty in including both "fixes". On the contrary, I have seen some small 
improvements with those  (AOPUnitTestCase runs 2.5 seconds faster with the fix 
on BaseClassPool; as starts 200 ms faster in all mode with both fixes).
I'm comitting this.

--------------------------------------------------------------

To reply to this message visit the message page: 
http://community.jboss.org/message/527258#527258


_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to